Computer Science

[자료구조] 이진 트리의 순회(중위순회/전위순회/후위순회)

imsunbow 2024. 2. 8. 19:38

이진트리의 순회는 다음과 같은 과정을 통해 이루어져야 한다.

 

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

반응형