Tree Traversal

트리 t의 traversal이란 각 노드를 정확힌 1번씩만 iterate(방문)하는 알고리즘을 말한다.
Note; 이 포스트에서 아래의 4가지 traversal알고리즘은 트리(특히 이진트리)구조에만 예시로 적용되어 있는데, 사실 트리의 상위 개념인 그래프구조에(노드와 엣지가 존재하는) 적용할 수 있다.

InOrder Traversal

inorder traversal은 left subtree - root - right subtree 순서로
recursive(재귀적)하게 iterate하며 처리하는 알고리즘이다. 기본적인 수도코드는 아래와 같다.

inOrder(t) {
    if(t is not empty) {
        inOrder( left subtree of t )
        process t's root element
        inOrder( right subtree of t )
    } 
} 

PostOrder Traversal

postorder traversal은 left subtree - right subtree - root 순서로
recursively iterate하며 처리하는 알고리즘이다. 기본적인 수도코드는 아래와 같다.

postOrder(t) {
    if(t is not empty) {
        postOrder( left subtree of t )
        postOrder( right subtree of t )
        process t's root element
    } 
} 

PreOrder Traversal (DFS)

preorder traversal은 root - left subtree - right subtree 순서로
recursively iterate하며 처리하는 알고리즘이다. 기본적인 수도코드는 아래와 같다.

preOrder(t) {
    if(t is not empty) {
        process t's root element
        preOrder( left subtree of t )
        preOrder( right subtree of t )
    } 
}

Level-Order Traversal (BFS)

level-order traversal은
root - roots of children(from left to right) - roots of grandchildren(from left to right) - … 순서로
recursively iterate하며 처리하는 알고리즘이다. 기본적인 수도코드는 아래와 같다.

levelOrder(BinaryTree t) {
    if(t is not empty) {
        // enqueue current root
        queue.enqueue(t)
        
        // while there are nodes to process
        while( queue is not empty ) {
            // dequeue next node
            BinaryTree tree = queue.dequeue();
            
            process tree's root;
            
            // enqueue child elements from next level in order
            if( tree has non-empty left subtree ) {
                queue.enqueue( left subtree of t )
            }
            if( tree has non-empty right subtree ) {
                queue.enqueue( right subtree of t )
            }
        }
    } 
} 

적용

binary_tree example
위의 그림에 4가지 traversal알고리즘을 적용하면 아래와 같이 처리한다.

  • InOrder: 1 2 3 4 5 6 7
  • PostOrder: 1 3 2 5 7 6 4
  • PreOrder: 4 2 1 3 6 5 7
  • Level-Order: 4 2 6 1 3 5 7

Reference

Day 23: BST Level-Order Traversal