二叉树重建


给出二叉树后序和中序遍历的结果,输出层次遍历的结果


在中序遍历中,先输出其左子树上的点,再根结点,最后是右子树上的点,所以根结点在两子树的中间;
在后序遍历中,先输出其左子树上的点,再右子树上的点,最后根结点,所以根结点在最右端;
#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[n]]<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/guogai13/article/details/79549082