HBU-DS2018SY-2-2 根據後序和中序遍歷輸出先序遍歷 (25 分)
阿新 • • 發佈:2018-12-29
題目描述:
本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。
輸入格式:
第一行給出正整數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.後序遍歷的遞迴過程為:若二叉樹為空,遍歷結束。否則:①後序遍歷根結點的左子樹;②後序遍歷根結點的右子樹;③訪問根結點。簡單來說後序遍歷就是從右子樹返回時遇到結點就訪問。
AC程式碼:
#include <bits/stdc++.h> using namespace std; void getpre(int *a,int *b,int n) //其中陣列a為後序,b為中序,n為每次遍歷數目,用來求c這個先序 { if(n>0) { int root = a[n-1]; //根結點為後序遍歷的最後一個 int i; for(i=0;i<n;i++) //在中序遍歷中查詢根結點 { if(b[i] == root) { break; } } cout << " " << root; getpre(a, b, i); //對左子樹來查詢根結點 getpre(a+i, b+i+1, n-i-1); //對右子樹來查詢根結點 } } int main() { int n; cin >> n; int a[n],b[n],c[n]; //a[n]後序 b[n]中序 for(int i=0;i<n;i++) { cin >> a[i]; //輸入後序 } for(int i=0;i<n;i++) { cin >> b[i]; //輸入中序 } cout << "Preorder:"; getpre(a,b,n); return 0; }