首先必需要有中序遍歷以及前序和後序之中的一種才能求第三種,也就是說沒有中序遍歷樹的結構是不肯定的。c++
#include<bits/stdc++.h> using namespace std; const int N=100000; int f[N],m[N],n; void solve(int x,int y,int n){//x表示當前子樹的前序遍歷的第一個數字的位置,y表示當前子樹中序遍歷的第一個數字的位置,n表示當前子樹的節點個數 if(n==1){ cout<<f[x]<<' '; return ; } if(n==0) return; int i=0; while(m[y+i]!=f[x]) i++; solve(x+1,y,i); solve(x+i+1,y+i+1,n-i-1); cout<<f[x]<<' '; } int main(){ int n;cin>>n; for(int i=1;i<=n;i++) cin>>m[i]; for(int i=1;i<=n;i++) cin>>f[i]; solve(1,1,n); cout<<endl; return 0; }
#include<bits/stdc++.h> using namespace std; const int N=100000; int b[N],m[N],n; void solve(int x,int y,int n){//x表示當前子樹後續遍歷的最後一個數字,y表示當前子樹中序遍歷的最後一個數字,n表示當前子樹的節點個數 if(n==1){ cout<<b[x]<<' '; return ; } if(n==0) return; int i=0; while(m[y-i]!=b[x]) i++; cout<<b[x]<<' '; solve(x-i-1,y-i-1,n-i-1); solve(x-1,y,i); } int main(){ int n;cin>>n; for(int i=1;i<=n;i++) cin>>b[i]; for(int i=1;i<=n;i++) cin>>m[i]; solve(n,n,n); cout<<endl; return 0; }