• [File System] ::트리 구현만 해보자

    2018. 1. 23. 17:59

    by. 위지원


    트리구현.c

    일단 트리 부터 구현해보자... (크기 상관 X)

    출처 http://thrillfighter.tistory.com/225



    1) 우선 노드의 모양을 구조체를 이용하여 선언한다.



         



    2) root 노드를 설정하여 tree를 생성하고 초기화 시켜준다.




    3) 부모노드를 확인하여

    - 왼쪽 오른쪽이 모두 꽉 차있는 경우에는 꽉 찾다는 말을하고

    - 그렇지 않은 경우에는 왼쪽 오른쪽중 비어있는 곳에 넣어준다. ( 왼쪽부터 넣어준다 )





    4) 각 노드의 자식노드를 또 삽입한다.





    5) 출력을 해본다 ( print문의 위치에 따라 변경 가능 )

    1) 전위 순화




    2) 중위 순회




    3) 후위 순회





    호오 잘된다.. 이진 트리로 변경해보자


    2. 이진 트리


    우리가 얼마전에 알아본 이진트리를 구현해보자. 이때 규칙이 있었다.  2018/01/22 - [석사 1학기차 겨울방학/c언어,화일구조,자바] - B Tree




     - 또한 중복 값이 존재하지 않아야합니다.


    위의 코드를 변경해보자.

    1) 중복값이 존재하지 않아야하고 좌우 크기를 고려해야하므로 AddChilde라는 함수를 변경해보자


    1-1) 중복 값을 검사하기 위해 root노드부터 차례대로 내려오면서 값을 비교한다.



    중복 검사가 잘되는 확인해봅시다. 1을 넣고 1을 또 넣으려 해보자



    아주 잘되네요



    1-2) 부모모다 작은 친구들은 왼쪽에 부모보다 큰 친구들은 오른쪽에 넣어보자. 전체 코드는 아래와 같다.

    - 부모를 가르키는 포인터를 생성한다.

    - 위의 중복 검사에서 아무 이상 없는 경우, 새로운 노드를 생성한다.

    - 새롭게 들어온 데이터와 부모의 데이터를 비교하여 삽입할 데이터의 위치를 선정한다.



    그 결과 다음과 같습니다.


            



    마지막에 확실하게 잘 되는지 0을 한번 입력해볼까요?



    역시나 잘됩니다.



    2) 삭제를 해보자

    삭제에는 아래의 3가지 경우가 있다. 부모노드를 따로 가르키는 포인터를 지정하여 지우려는 값과 일치하는 자식의 값을 NULL로 표기한다.

    1. 자식노드가 2개인 경우 : 왼쪽 서브트리의 가장 큰 값 , 오른쪽 서브트리의 가장 작은 값을 부모노드와 연결

    2. 자식노드가 1개인 경우 : 1개의 자식노드와 부모노드를 연결

    3. 리프노드인 경우  : 걍삭제


       





    1. 삭제하려는 노드의 자식이 하나도 없는 경우에는 바로 아래의 값을 null로 해줍니다.



    + 83번째 줄은 부모가 없는경우=root이기때문에..



    if문을 이용해서 삭제하려는 current 포인터가 가르키는 노드가 왼쪽에 있는지 오른쪽에 있는지 확인한 뒤 해당 노드를 NULL로 만들어줍니다


    2.삭제하려는 노드의 자식이 한개만 있는 경우





    포인터를 하나더 사용해서 삭제할노드의 자식노드와 삭제할 노드의 부모노드를 연결해준다.



    3.삭제하려는 노드의 자식이 모두(2개) 있는 경우









    이상황에서 이제 child의 value를 current value로 지정합니다.





    실행 결과



    노드를 rand함수로 무작위로 생성하고 삭제하는 값 또한 rand로 무작위로 삭제하게 하였다.



    아래와 같은 트리가 생겼다.



    그 후 삭제 결과는 아래와 같다. 2가 사라졌고 13이 사라지자 13의 자리에는 오른쪽 서브트리의 최소 값인 14가 와있다.

    근데 null로 해버리기로 해서 그런지 0으로 표시되어있다...free하면 에러가나고 아직 이유를 모르겠다 ㅠ_ㅠ.. 하읍 c어렵다.

    일단 요까지만 해놓고 요부분은 다시 수정해봐야겠다.






    '2018년 > C, Java, FileSystem' 카테고리의 다른 글

    [File System] ::사분트리(QuadTree)  (0) 2018.02.02
    [File System] ::Grid File  (0) 2018.01.30
    [File System] ::트라이(trie)  (0) 2018.01.22
    [File System] ::B* tree, B+ tree  (0) 2018.01.22
    [File System] ::B Tree  (0) 2018.01.22

    대화의 장 💬