您的位置:首页 > 其它

二叉树重建

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: