根據后序和中序遍歷輸出先序遍歷
題目描述:
本題要求根據給定的一棵二叉樹的后序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。
輸入格式:
第一行給出正整數N(≤30),是樹中結點的個數。隨后兩行,每行給出N個整數,分別對應后序遍歷和中序遍歷結果,數字間以空格分隔。題目保證輸入正確對應一棵二叉樹。
輸出格式:
在一行中輸出Preorder:以及該樹的先序遍歷結果。數字間有1個空格,行末不得有多余空格。
輸入樣例:
7 2 3 1 5 7 6 4 1 2 3 4 5 6 7
輸出樣例:
Preorder: 4 1 3 2 6 5 7
相關知識:
1.先序遍歷的遞歸過程為:若二叉樹為空,遍歷結束。否則:①訪問根結點;②先序遍歷根結點的左子樹;③先序遍歷根結點的右子樹。 簡單來說先序遍歷就是在深入時遇到結點就訪問。
2.中序遍歷的遞歸過程為:若二叉樹為空,遍歷結束。否則:①中序遍歷根結點的左子樹;②訪問根結點;③中序遍歷根結點的右子樹。簡單來說中序遍歷就是從左子樹返回時遇到結點就訪問。
3.后序遍歷的遞歸過程為:若二叉樹為空,遍歷結束。否則:①后序遍歷根結點的左子樹;②后序遍歷根結點的右子樹;③訪問根結點。簡單來說后序遍歷就是從右子樹返回時遇到結點就訪問。
我的代碼:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 void getpre(int *a,int *b,int n) //其中數組a為后序,b為中序,n為每次遍歷數目,用來求c這個先序 5 { 6 if(n>0) 7 { 8 int root = a[n-1]; //根結點為后序遍歷的最后一個 9 int i; 10 for(i=0;i<n;i++) //在中序遍歷中查找根結點 11 { 12 if(b[i] == root) 13 { 14 break; 15 } 16 } 17 cout << " " << root; 18 getpre(a, b, i); //對左子樹來查找根結點 19 getpre(a+i, b+i+1, n-i-1); //對右子樹來查找根結點 20 } 21 } 22 23 int main() 24 { 25 int n; 26 cin >> n; 27 int a[n],b[n],c[n]; //a[n]后序 b[n]中序 28 for(int i=0;i<n;i++) 29 { 30 cin >> a[i]; //輸入后序 31 } 32 for(int i=0;i<n;i++) 33 { 34 cin >> b[i]; //輸入中序 35 } 36 cout << "Preorder:"; 37 getpre(a,b,n); 38 return 0; 39 }
