본문 바로가기
5장 컴퓨터 과학/Data Structure & Algorithm

[알고리즘] 이진 트리 순회(Binary Tree Traversal)

2021. 6. 11.

전위 순회(Preorder Traversal)

이진 트리는 트리의 일종으로 일반적인 트리에 대한 전위 순회 알고리즘이 똑같이 적용될 수 있다.

template <typename T>
void preorder(Node<T>* node)
{
    if (node == nullptr) return;
    cout<<node->GetValue()<<" ";
    preorder(node->GetLeft());
    preorder(node->GetRight());
}

후위 순회(Postorder Traversal)

마찬가지로 후위 순회 알고리즘도 똑같이 적용된다.

template <typename T>
void postorder(Node<T>* node)
{
    if (node == nullptr) return;
    postorder(node->GetLeft());
    postorder(node->GetRight());
    cout <<node->GetValue()<<" ";
}

중위 순회(Inorder Traversal)

일반적인 트리와 다르게 이진 트리는 최대 2개의 자식 노드를 갖는다. 따라서 왼쪽 자식 노드를 방문하고 부모 노드를 방문하고 오른쪽 자식 노드를 방문하는 알고리즘이 구현 가능하다.

template <typename T> 
void inorder(Node<T>* node)
{
    if (node == nullptr) return;
    inorder(node->GetLeft());
    cout<<node->GetValue()<<" ";
    inorder(node->GetRight());
}

너비 우선 순회(Breadth-First Traversal)

마찬가지로 너비 우선 순회도 구현 가능하다.

template <typename T> 
void bfs(Node<T>* node)
{
    queue<Node<T>*> q;
    q.push(node);
    while (!q.empty())
    {
        cout<<q.front()->GetValue()<<" ";
        if (q.front()->GetLeft() != nullptr) q.push(q.front()->GetLeft());
        if (q.front()->GetRight() != nullptr) q.push(q.front()->GetRight());
        q.pop();
    }
}

 

오일러 투어 순회(Euler Tour Traversal)

오일러 투어 순회는 전위 순회, 중위 순회, 후위 순회를 모두 합친 형태이다.

template <typename T>
void eulertour(Node<T>* node)
{
    if (node == nullptr) return;
    cout <<node->GetValue()<<" ";
    eulertour(node->GetLeft());
    cout <<node->GetValue()<<" ";
    eulertour(node->GetRight());
    cout <<node->GetValue()<<" ";
}
반응형

댓글