MY MEMO
[ALGOSPOT] TRAVERSAL 트리 순회 순서 변경 본문
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(); } } |
'ALGORITHM > ALGORITHM STUDY' 카테고리의 다른 글
[Google Code Jam]2016_Qualification Round_ProblemC_Coin Jam (0) | 2017.03.28 |
---|---|
[ALGOSPOT] RATIO 승률 올리기 (0) | 2017.02.25 |
[ALGOSPOT] ROUTING 신호 라우팅 (0) | 2017.02.25 |
[DATASTRUCTURE] DFS, BFS (0) | 2017.02.25 |
[ALGOSPOT] LAN 근거리 네트워크 (0) | 2017.02.25 |