ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자료구조]CH7. 트리(이진 탐색 트리)
    자료구조 공부 2021. 3. 21. 23:57

    참조 : C로 배우는 쉬운 자료구조(이지영 저)

    공부날짜 : 2021.02.18

     

    <Section5> 이진 탐색 트리

     

    1. 이진 탐색 트리의 개념

     

     이진 트리를 탐색용 자료구조로 사용하기 위해 원소 크기에 따라 노드 위치를 정의한 것이다. 탐색을 위해서는 찾을 자료를 식별할 수 있는 유일한 값이 필요한데, 이것을 키(key)라고 한다. 

     

     1) 모든 원소는 서로 다른 유일한 키를 갖는다. 

     2) 왼쪽 서브 트리에 있는 원소들의 키는 그 루트의 키보다 작다. 

     3) 오른쪽 서브 트리에 있는 원소들의 키는 그 루트의 키보다 크다. 

     4) 왼쪽 서브 트리와 오른쪽 서브 트리도 이진 탐색 트리이다. 

     

    2. 이진 탐색 트리의 탐색 연산

     

     searchBST(bsT , x)

          p ← bsT; //포인터 p

          if (p = NULL) then

             return NULL;

          if (x = p.key) then 

             return p;

          if (x < p.key) then 

             return searchBST(p.left , x);

          else return searchBST(p.right , x);

     end searchBST()

     

    3. 이진 탐색 트리의 삽입 연산

     

     insertBST(bsT , x)

         p ← bsT; // 삽입할 자리를 찾기 위한 포인터

         while (p != NULL) do {

              if (x = p.key) then return;

              q ← p; // 삽입할 노드의 부모 노드를 지정하기 위한 포인터

              if (x < p.key) then p ← p.left;

              else p ← p.right;

         } // 삽입할 노드 탐색

     

         new ← getNode();

         new.key ← x;

         new.left ← NULL;

         new.right ← NULL; // 삽입할 노드 생성

     

         if (bsT = NULL) then bsT new;

         else if (x < q.key) then q.left new;

         else q.right new;

         return; // 삽입 노드 연결

     end insertBST()

     

    4. 이진 탐색 트리의 삭제 연산

     

     deleteBST(bsT , x)

         p ← 삭제할 노드;

         parent ← 삭제할 노드의 부모 노드;

     

         // 0. 삭제할 노드가 없는 경우

         if (p = NULL) then return;

     

         // 1. 삭제할 노드의 차수가 0인 경우

         if (p.left = NULL and p.right = NULL) then {

             if (parent.left = p) then parent.left ← NULL;

             else parent.right ← NULL;

         }

     

         // 2. 삭제할 노드의 차수가 1인 경우

         else if (p.left = NULL or p.right = NULL) then {

             if (p.left != NULL) then {

                 if (parent.left = p) then parent.left ← p.left;

                 else parent.right ← p.left;

             }

             else {

                 if (parent.left = p) then parent.left ← p.right;

                 else parent.right ← p.right;

             } 

         }

         // 3. 삭제할 노드의 차수가 2인 경우

         else if (p.left != NULL and p.right != NULL) then {

             q ← maxNode(p.left); // 왼쪽 서브트리에서 후계자 노드를 포인터 q로 지정

             p.key ← q.key;

             deleteBST(p.left , p.key); //후계자 노드 자리에 대한 2차 재구성

         }

     end deleteBST()

         

Designed by Tistory.