第六章樹和二叉樹作業1—二叉樹--計算機17級 7-1 根據後序和中序遍歷輸出先序遍歷 (25 分)
阿新 • • 發佈:2018-11-12
7-1 根據後序和中序遍歷輸出先序遍歷 (25 分)
本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。
輸入格式:
第一行給出正整數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
思路:現將其還原為二叉樹,最後再先序遍歷輸出即可
後序和中序遍歷確定一顆二叉樹的思路:
a:根據後序遍歷序列確定最後一個結點為根節點
b:根據根結點在中序遍歷序列中分割出左右兩個子序列
c:對左子樹和右子樹分別遞迴使用相同的方法繼續分解
程式碼實現:
#include <bits/stdc++.h> typedef int TElemType;//千萬別寫成char #define maxn 101 using namespace std; typedef struct TNode* BinTree; struct TNode{ TElemType data; BinTree left; BinTree right; }; int n; int mid[maxn]; int post[maxn]; BinTree build(int *mid,int *post,int n)//第一個引數是中序序列的起始位置,第二個引數是後序序列的起始位置 { BinTree tmp = (BinTree)malloc(sizeof(TNode)); tmp->data = post[n-1];//第一個結點指向後序遍歷的最後,也就是後序的樹根 int i; if(n == 0) return NULL; for(i = 0;i < n;i++) { if(mid[i] == post[n-1])//找中序的根 break;//找到就跳出來 } tmp->left = build(mid,post,i);//傳入左子樹的mid與post tmp->right = build(mid+i+1,post+i,n-i-1);//傳入右子樹的mid與post //tmp->data = post[n-1];//第一個結點指向後序遍歷的最後,也就是後序的樹根 return tmp; } void PreorderTraversal( BinTree BT ) { if(BT) { cout<<" "<<BT->data; if(BT->left) PreorderTraversal( BT->left ); if(BT->right) PreorderTraversal( BT->right ); } else return ; } int main() { cin>>n; for(int i = 0;i < n;i++) cin>>post[i]; for(int i = 0;i < n;i++) cin>>mid[i]; BinTree t = build(mid,post,n); cout<<"Preorder:"; PreorderTraversal(t); }