1. 程式人生 > >HDU 1710Binary Tree Traversals(已知前序中序,求後序的二叉樹遍歷)

HDU 1710Binary Tree Traversals(已知前序中序,求後序的二叉樹遍歷)

pid http pan clu names pty efi images 樹遍歷

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1710

解題思路:可以由先序和中序的性質得到 : 先序的第一個借點肯定是當前子樹的根結點, 那麽在

中序中找到這個結點, 則這個結點左邊的節點屬於左子樹, 右邊的屬於右子樹。然後遞歸遍歷就可以了。 樣例: 9 1 2 4 7 3 5 8 9 6 4 7 2 1 8 5 9 3 6 7 4 2 8 9 5 6 3 1 如圖: 技術分享 因此,用深搜就能輕松解決了,註意DFS中的變量,以及向清楚DFS的條件,這題就簡單多了,具體看代碼吧:
#include<iostream>
#include
<string.h> #include<cstdio> #include<stack> using namespace std; #define maxn 1001 int m,n,a[maxn],b[maxn]; //先序數組和後序數組 stack<int>Q; //存放父節點 void dfs(int l1,int r1,int l2,int r2) {//l1,r1,是先序遍歷的數組的開始和末尾,l2,r2是中序遍歷的數組的開始和末尾 int i,j; Q.push(a[l1]); //父節點入棧 for(i=l2;i<=r2;i++)
if(b[i]==a[l1]) break; //i 父節點在中序遍歷的位置,j 左子樹和右子樹在先序遍歷的分界點,即右子樹的父節點 j=l1+(i-l2+1); if(j<=r1&&i-1<=r2) dfs(j,r1,i+1,r2); //求解右子樹 if(l1+1<=j-1&&l2<=i-1) dfs(l1+1,j-1,l2,i-1); //求解左子樹 //不能換位置,根據輸出的後序遍歷圖可以看出,棧的後方為右半部分 } int main() { while(cin>>n) {
for(int i=0;i<n;i++) scanf("%d",&a[i]); for(int i=0;i<n;i++) scanf("%d",&b[i]); dfs(0,n-1,0,n-1); while(!Q.empty()) { printf("%d",Q.top()); Q.pop(); if(Q.size()) printf(" "); } cout<<endl; } return 0; }

HDU 1710Binary Tree Traversals(已知前序中序,求後序的二叉樹遍歷)