二叉树重建
2018-03-14 02:06
197 查看
题目点击打开链接
给出二叉树后序和中序遍历的结果,输出层次遍历的结果
在中序遍历中,先输出其左子树上的点,再根结点,最后是右子树上的点,所以根结点在两子树的中间;在后序遍历中,先输出其左子树上的点,再右子树上的点,最后根结点,所以根结点在最右端;
给出二叉树后序和中序遍历的结果,输出层次遍历的结果
在中序遍历中,先输出其左子树上的点,再根结点,最后是右子树上的点,所以根结点在两子树的中间;在后序遍历中,先输出其左子树上的点,再右子树上的点,最后根结点,所以根结点在最右端;
#include<iostream> #include<queue> using namespace std; int A[10000],B[10000],lef[10000],righ[10000]; int build(int L1,int R1,int L2,int R2){ //返回根结点的在序列A中的位置 if(L1>R1||L2>R2) return -1; int i=L2; while(B[i]!=A[R1]) i++; //后序遍历中根结点一定在最右端,在中序遍历中找根结点的位置, lef[R1]=build(L1,L1+i-L2-1,L2,i-1); //分别建左右子树,i-L2为左子树点的 个数 righ[R1]=build(L1+i-L2,R1-1,i+1,R2); return R1; } int main(){ int u,root,n,i; cin>>n; for(i=1;i<=n;i++) cin>>A[i]; for(i=1;i<=n;i++) cin>>B[i]; root=build(1,n,1,n); int order[10000]; queue<int>q; i=1; for(q.push(root);!q.empty();q.pop()){ //BFS层次遍历 u=q.front(); order[i++]=u; if(lef[u]!=-1) q.push(lef[u]); if(righ[u]!=-1) q.push(righ[u]); } for(i=1;i<n;i++) cout<<A[order[i]]<<" "; cout<<A[order ]<<endl; return 0; }
相关文章推荐
- uva839 Not so Mobile (重建二叉树)
- 重建二叉树
- 剑指Offer:面试题6——重建二叉树(java实现)
- nyoj 756 重建二叉树
- 根据后序和中序遍历重建二叉树
- 重建二叉树(1)
- 重建二叉树
- 剑指offer:重建二叉树
- 编程之美3.9 重建二叉树
- 剑指offer 6题 【树】重建二叉树
- Java重建二叉树
- 重建二叉树
- L2-011. 玩转二叉树 -二叉树的重建
- 已知二叉树的前序与中序遍历序列,求重建后的二叉树(即是二叉树的重建)
- 已知二叉树的前序、中序遍历,重建二叉树
- [NewCode 6] 重建二叉树
- 面试题7:重建二叉树(offer)
- 二叉树(14)----由前序遍历和中序遍历重建二叉树,递归方式
- 编程之美---重建二叉树
- 编程之美--重建二叉树