二叉树知道前序、中序求后序序列
思路:
【1】根据前序性质,每一颗子树的前序第一个节点永远是其根节点(后序也有类似性质,所以知道后序中序求前序是一个道理)。
【2】根据中序性质,在中序序列中,某节点之前的节点全在其左边,反之在其右边。
那么我们在前序序列中找到当前树根节点时,再在中序序列中找到树根节点的位置,那么知道中序序列中,在根节点以前的节点都是其左子树,之后的是右子树,这样就可以递归建这两棵树,这里我们选择直接打印后序序列,打印顺序为递归左子树,递归右子树,打印自身。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> using namespace std; vector<int> ans; vector<int> v1,v2; void dfs(int a,int b,int cnt) { if(cnt == 1) { ans.push_back(v1[a]); return; } else if(cnt <= 0) return; int i; for(i=0;v1[a] != v2[b+i];i++); dfs(a+1,b,i); dfs(a+i+1,b+i+1,cnt-i-1); ans.push_back(v1[a]); return; } int main() { int n; while(scanf("%d",&n)!=EOF) { v1.clear(); v2.clear(); ans.clear(); int num; for(int i=0;i<n;i++) { scanf("%d",&num); v1.push_back(num); } for(int i=0;i<n;i++) { scanf("%d",&num); v2.push_back(num); } dfs(0,0,n); printf("%d",ans[0]); for(int i=1;i<ans.size();i++) printf(" %d",ans[i]); puts(""); } return 0; }
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com