이진트리의 순회는 다음과 같은 과정을 통해 이루어져야 한다.
1) 트리에 있는 모든 노드를 단 한번씩만 방문해야 함
2) 왼쪽 서브트리는 항상 오른쪽 서브트리보다 먼저 방문해야 함
순회 방법으로는 총 세가지가 있는데, LVR(중위순회), VLR(전위순회), LRV(후위순회) 이다.
1) 중위순회
왼쪽 서브트리 방문 > 루트 노드 방문> 오른쪽 서브트리 방문
2) 전위순회
루트노드 방문> 왼쪽 서브트리 방문> 오른쪽 서브트리 방문
3) 후위순회
왼쪽 서브트리 방문> 오른쪽 서브트리방문> 루트노드 방문
class TreeNode:
def __init__(self, key):
self.left = None
self.right = None
self.val = key
def inorder_traversal(root):
if root:
# 왼쪽 서브트리를 중위순회
inorder_traversal(root.left)
# 현재 노드 방문
print(root.val, end=' ')
# 오른쪽 서브트리를 중위순회
inorder_traversal(root.right)
def preorder_traversal(root):
if root:
# 현재 노드 방문
print(root.val, end=' ')
# 왼쪽 서브트리를 전위순회
preorder_traversal(root.left)
# 오른쪽 서브트리를 전위순회
preorder_traversal(root.right)
def postorder_traversal(root):
if root:
# 왼쪽 서브트리를 후위순회
postorder_traversal(root.left)
# 오른쪽 서브트리를 후위순회
postorder_traversal(root.right)
# 현재 노드 방문
print(root.val, end=' ')
# 예제 트리 생성
# 1
# / \
# 2 3
# / \
# 4 5
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print("중위순회:")
inorder_traversal(root)
print("\n전위순회:")
preorder_traversal(root)
print("\n후위순회:")
postorder_traversal(root)
코드 실행시 결과:
중위순회 : 4 2 5 1 3
전위순회: 1 2 4 5 3
후위순회: 4 5 2 3 1
'Computer Science' 카테고리의 다른 글
[자료구조] 이진 탐색 트리 : 탐색, 삽입, 삭제 연산의 구현 (0) | 2024.02.10 |
---|---|
[자료구조] 트리(Tree) 정의 및 용어 정리 (0) | 2024.02.09 |
[자료구조] 덱(Deque) 컨셉, 배열/연결리스트 구현 매커니즘 (0) | 2024.02.07 |
[자료구조] 큐 구현: 연결리스트 이용 방법 (0) | 2024.02.06 |
[자료구조] 큐 구현: 배열 이용방법(feat. enqueue, dequeue, peek 알고리즘), queue가 가지는 한계점 (0) | 2024.02.05 |