3 분 소요

image


Binary Search Tree

  • A binary tree
  • Every node has a key (= value).
  • Every node’s key K is
    • larger than all keys in its left subtree
    • smaller than all keys in its right subtree.


image


image


구현


BST : Linked List로 구현

  • Node 구조
struct node *BST_ptr;
struct node
  BST_ptr left
  int data
  BST_ptr right
BST_ptr T = NULL;


image


image


BST : Operations

  • Find(=Search) : BST에서 원하는(임의)값 X를 찾아라
  • Insert : 새로운 값 X를 BST에 삽입
  • Delete : 필요없는 값 X를 BST에서 삭제
  • Find-Max : 가장 큰 값 X를 찾아라
  • Find-Min : 가장 작은 값 X를 찾아라
  • Find_Successor : X 다음으로 큰 값을 찾아라
  • Sort : BST에 있는 모든 key값을 오름차순으로 정렬하여 출력


Find

  • BST로부터 원하는 key 값 X를 갖는 node를 search;
BST_ptr SEARCH(BST_ptr T; int X)
/* 찾고자 하는 key X를 갖는 node를 찾아서 반환, 만약
없으면 NULL을 반환. T는 처음에 root를 가리킴 */
{
  if (T == NULL), return NULL; /* 비었거나, 실패 */
  if (X == T -> data) return T; /* 성공 */
  if (X < T -> data) return SEARCH(T -> left, X) /* T가 왼쪽으로 이동 */
  if (X > T -> data) return SEARCH(T -> right, X) /* T가 오른쪽으로 이동 */
}


image


image


Find : Smallest (Largest) Key

FIND_MIN (tree_ptr T)
{
  while (T -> left <> NULL)
    T = T -> left;
  return(T);
}
FIND_MAX (tree_ptr T)
{
  while (T -> right <> NULL)
    T = T -> right;
  return(T);
}
  • Smallest key는 항상 맨 왼쪽 leaf 에, Largest key는 맨 오른 쪽 leaf에 항상 있음. 그리고 이 leaf들의 degree는 0 혹은 1을 가짐.


image


Insert

  • Insert a new key X into BST
  • 우선 SEARCH algorithm를 이용하여 X를 탐색;
  • 만약 BST에 X가 있으면 이미 있으면 do nothing! 만약 없으면 X를 BST에 insert함.
  • 여기서 X가 insert 되는 위치는?
    • : 항상 탐색이 종료된 leaf의 왼쪽 혹은 오른쪽 child (즉, null link)에서 발생;
  • 이제 새로운 node를 할당 받은 후 여기에 X를 저장한 후 BST에 연결하면 삽입 완료.


image


image


image


Delete

  • Delete a key X from BST; 우선 SEARCH algorithm를 이용하여 X를 탐색; If found, just delete it; Otherwise, return error.
  • 다음 3 가지 경우가 발생; 즉, delete되는 node가
    • 1) Child가 없는 경우 : 그냥 삭제함.
    • 2) Child가 1 개인 경우 : 이 node의 parent의 해당 link를 이 node의 child를 가리키게 한 후, 삭제함.
    • 3) Child가 2 개인 경우 : 2 가지 방법, 삭제되는 node의 오른 쪽 (혹은 왼쪽) subtree 에서 가장 smallest (혹은 largest) key를 찾아, 이 key 값을 삭제되는 node에 대체함. 그리고 smallest (혹은 largest) key를 갖는 node를 삭제


Delete : Leaf node

image


  • Leaf node의 삭제인 경우는 매우 간단함. 즉 삭제되는 leaf를 가리키는 Parent의 link 값 (위의 경우는 left child link)을 null로 하고, 삭제된 node를 storage pool로 반환함.


Delete : Node with degree 1

image


  • 이 경우도 꽤 간단함. 즉 삭제되는 leaf를 가리키는 parent의 해당 link 값 (위의 경우 right child link)을 삭제되는 node의 child를 가리키도록 함. 삭제된 node는 storage pool로 반환함


Delete : Node with degree 2

image


  • 삭제되는 node 10의 오른쪽 subtree에서 가장 작은 값(25)을 찾음.
  • 10을 25로 대체한 후, 가장 작은 값을 갖는 node를 삭제함.
  • 최종 결과


image


  • 삭제되는 node 10의 왼쪽 subtree에서 가장 큰 값(5)을 찾음.
  • 10을 5로 대체한 후, 가장 큰 값을 갖는 node를 삭제함.
  • 최종 결과


성능 분석 : BST

  • Find, Find_Max(Min), Insert, Delete are all bounded by O(h) where h is the height of the BST.
  • 즉, root에서 부터 가장 아래에 있는 leaf 까지의 최대 길이 h.


image


  • Height of BST depends on shapes of BST.
  • Shapes of BST depends on order of insertions.


Shapes of BST

image


Average Case

  • Average case는 각 node 당 평균 비교 회수로 산정됨
  • 각 node 당 평균 비교회수 = 총 비교 회수 / 총 node 수(n)
  • 총 비교 회수 = 각 node의 level들의 총 합 = Internal Path Length


image


  • Average Internal path T(n) of BST with n nodes is known $O(n\log_2n)$.
  • Thus, average case is T(n)/n is $O(\log_2n)$.
  • In practice, if the keys are inserted in random order, all operations are $O(\log_2n)$. It is about $1.44\log_2n$


image


Worst Case

  • However, Worst case is O(n) when BST is a form of skewed binary tree.
  • 예 : 다음의 key들을 insert 할 때 worst case가 나오는 경우는?
    • {1, 2, 3, . . . 10}
    • Ascending order
    • Descending order
    • Zig-Zag order
    • etc.,
  • Can we avoid O(n) in worst case? (즉, worst case에도 O(log2n)이 되도록 할 수 있는지?)
  • 해결책 : “Balanced” BST


image


Performance Comparison

image


연습

  • BST에 저장된 모든 key들을 오름 차순(increasing order)로 sort해서 출력하는 방법은?
  • (혹은) 위의 key들을 내림 차순(decreasing order)로 출력하는 방법은?
  • BST에서 임의의 key 값 X 바로 다음으로 큰 값 (= successor)을 갖는 key를 찾는 방법은?
  • 다음의 key들로부터 생성될 수 있는 BST들을 모두 그리고, 각 BST에 대해 비교 회수를 계산하라. {for, if, while, else}

댓글남기기