이상적(좌우 크기가 대칭)인 이진 탐색 트리에서 데이터를 탐색하는 경우, 시간복잡도는 O(logN)
1-3. 트리의 순회(Tree Traversal)
트리 자료구조에 포함된 노드를 특정한 방법으로 한 번씩 방문하는 방법을 의미
트리 정보를 시각적으로 확인할 수 있음
- 대표적인 트리 순회 방법
전위 순회(pre-order traverse) : 루트를 먼저 방문한 다음 왼쪽, 오른쪽 차례로 방문
루트 -> 왼쪽 -> 오른쪽
중위 순회(in-order traverse) : 왼쪽 자식을 방문한 뒤에 루트를 방문, 마지막으로 오른쪽 노드 방문
왼쪽 -> 루트 -> 오른쪽
후위 순회(post-order traverse) : 왼쪽, 오른쪽 자식을 차례로 방문한 뒤에 루트를 방문
왼쪽 -> 오른쪽 -> 루트
- 트리 순회 예시
전위 순회 : A -> B -> D -> E -> C -> F -> G
중위 순회 : D -> B -> E -> A -> F -> C -> G
후위 순회 : D -> E -> B -> F -> G -> C -> A
1-4. 트리의 순회 구현 예제
# ex)# 트리 순회 구현 예제 코드 (Pyhton)classNode:def__init__(self, data, left_node, right_node):
self.data = data
self.left_node = left_node
self.right_node = right_node
# 전위 순회(Pre-order Traversal)defpre_order(node):print(node.data, end=' ')if node.left_node !=None:
pre_order(tree[node.left_node])if node.right_node !=None:
pre_order(tree[node.right_node])# 중위 순회(In-order Traversal)defin_order(node):if node.left_node !=None:
in_order(tree[node.left_node])print(node.data, end=' ')if node.right_node !=None:
in_order(tree[node.right_node])# 후위 순회(Post-order Traversal)defpost_order(node):if node.left_node !=None:
post_order(tree[node.left_node])if node.right_node !=None:
post_order(tree[node.right_node])print(node.data, end=' ')
n =int(input())
tree ={}for i inrange(n):
data, left_node, right_node =input().split()if left_node =="None":
left_node =Noneif right_node =="None":
right_node =None
tree[data]= Node(data, left_node, right_node)
pre_order(tree['A'])print()
in_order(tree['A'])print()
post_order(tree['A'])# 입력# 7# A B C // 노드 A의 왼쪽 자식 노드는 B, 오른쪽 자식 노드는 C# B D E // 노드 B의 왼쪽 자식 노드는 D, 오른쪽 자식 노드는 E# C F G // 노드 C의 왼쪽 자식 노드는 F, 오른쪽 자식 노드는 G# D None None // 노드 D의 왼쪽 자식 노드는 None, 오른쪽 자식 노드는 None# E None None // 노드 E의 왼쪽 자식 노드는 None, 오른쪽 자식 노드는 None# F None None // 노드 F의 왼쪽 자식 노드는 None, 오른쪽 자식 노드는 None# G None None // 노드 G의 왼쪽 자식 노드는 None, 오른쪽 자식 노드는 None# 출력# "A B D E C F G "# "D B E A F C G "# "D E B F G C A "