MY MEMO

[ALGOSPOT] TRAVERSAL 트리 순회 순서 변경 본문

ALGORITHM/ALGORITHM STUDY

[ALGOSPOT] TRAVERSAL 트리 순회 순서 변경

l_j_yeon 2017. 2. 25. 18:30

ALGOSPOT TRAVERSAL : https://algospot.com/judge/problem/read/TRAVERSAL


전위 순회, 중위 순회, 후위 순회의 개념

참고 : https://algospot.com/judge/problem/read/TRAVERSAL


<algorithm>


전위 순회는 루트->왼쪽->오른쪽

중위 순회는 왼쪽->루트->오른쪽


즉 루트가 나오는 순서에 따라 전위 중위 후위로 나눈다.

이를 이용하면 후위순회를 찾을 수 있다.


1. 전위 순회의 값을 이용하여 루트를 알수있다

2. 알아낸 루트값을 이용하여 입력받은 중위 순회의 배열을 왼쪽 트리의 값과 오른쪽 트리의 값으로 나눌 수 있다.

3. 위의 과정을 반복하여 왼쪽트리를 끝까지 탐색한다

4. 이후 올라가면서 오른쪽 트리가 존재하면 탐색한다



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
 
vector<int>Preorder;
vector<int>Inorder;
vector<int>Postorder;
 
void Make_Post_Order(vector<int>&inorder, int Root)
{
    if (Preorder.empty() || inorder.empty()) return;
    Root = Preorder[0];
    Preorder.erase(Preorder.begin());
 
    vector<int>::iterator iter = find(inorder.begin(), inorder.end(), Root);
 
    vector<int>Left, Right;
    Left.assign(inorder.begin(), iter);
    Right.assign(iter + 1, inorder.end());
 
    Make_Post_Order(Left, Root);
    Make_Post_Order(Right, Root);
 
    Postorder.push_back(Root);
}
 
int main()
{
    int For_Count;
    cin >> For_Count;
 
    for (int i = 0; i < For_Count; i++)
    {
        int Node_Count;
        cin >> Node_Count;
 
        Preorder = vector<int>(Node_Count);
        Inorder = vector<int>(Node_Count);
 
        for (int j = 0; j < Node_Count; j++)
        {
            cin >> Preorder[j];
        }
        for (int j = 0; j < Node_Count; j++)
        {
            cin >> Inorder[j];
        }
 
        Make_Post_Order(Inorder, 0);
 
        for (int j = 0; j < Postorder.size(); j++)
        {
            cout << Postorder[j] << " ";
        }
        cout << endl;
 
        Postorder.clear();
    }
}


Comments