Updated:

트리

  • directed(위→아래) acyclic graph!
    • 뭔 말인가 싶은가요?

트리 용어

1.jpg

  • 노드의 degree : branch 개수
  • depth : tree의 최대 level → 현재 예시는 depth = 3
  • 사실상 트리의 각 노드에 올 수 있는 edge의 개수는 무한 개다.
    • edge 개수를 (최대) 2개로 고정시키자! → binary tree!

이진트리

  • 각 node의 edge의 개수가 최대 2개인 트리
  • depth K의 최대 노드 개수 : $2^K-1 (K≥1)$
    e.g.) depth=3인 경우 최대 노드는 $2^3-1=7$개이다.

이진트리의 종류

full binary tree

  • 최대 노드 개수 $2^K-1 (K≥1)$를 가진 이진트리

2.jpg

complete binary tree

  • full binary tree의 ordering을 따르는 이진트리

3.jpg

skewed tree

  • 한쪽으로 치우친 트리 → TERRIBLE!

4.jpg

이진트리 순회

순회(traversal)

  • 모든 node 한 번씩만 방문
  • 순회 시 할 수 있는 동작들
    • left edge로 간다. (L; left edge)
    • 현재 node를 방문한다. (V; visit)
    • right edge로 간다. (R; right edge)

순회 종류

단 L과 R이 있을 때 L→R 순서로 간다고 가정한다.

중위순회 (In-order traversal) LVR (left → visit →right)

전위순회 (Pre-order traversal) VLR(visit → left → right)

후위순회 (Post-order traversal) LRV(left → right → visit)

순회 예시

5.jpg

순회 종류 방문 순서
중위 (LVR) D B E A F C G
후위 (LRV) D E B F G C A
전위 (VLR) A B D E C F G

이진탐색트리(BST; Binary Search Tree)

이진탐색트리

6.jpg

  • 모든 노드들이 서로 다른 값을 가진다.
  • left subtree에 있는 값들은 현재 노드의 값보다 작다.
  • right subtree에 있는 값들은 현재 노드의 값보다 크다.
  • complete binary tree는 아니다.

이진탐색트리의 탐색법

def BST(tree, key):  # tree : 현재의 수를 가리키는 포인터, key : 찾는 수
        while tree:  # 이진탐색트리가 비어있지 않다면 실행
                if key == tree: # 현재 찾는 수를 가리키고 있다면
                        return tree
                elif key < tree:  # 현재 가리키는 수가 찾는 수보다 크다면
                        tree = left_child # 왼쪽 child로 이동 (작은 수 찾아야 한다.)
                else:  # 현재 가리키는 수가 찾는 수보다 작다면
                        tree = right_child # 오른쪽 child로 이동 (큰 수 찾아야 한다.)