1020. Tree Traversals (25)

Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
Sample Output:
4 1 6 3 5 7 2
#include<iostream>
#include<queue>
using namespace std;
typedef struct Node
{
    int value;
    int lchild;
    int rchlid;
}Node;
int postOrder[30];
int loc[30];
Node inOrder[30];
int maxloc(int m,int n)
{
    if(m>n)
        return (-1);
    int i;
    int maxt=m;
    int maxk=loc[m];
    for(i=m+1;i<=n;++i)
    {
        if(maxk<loc[i])
        {
            maxt=i;
            maxk=loc[i];
        }
    }
    return maxt;
}
void BinaryTree(int m,int start,int n)
{
    if(m>n)
        return;
    else if(m==n)
    {
        inOrder[start].lchild=-1;
        inOrder[start].rchlid=-1;
        return;
    }
    int k1=maxloc(m,start-1);
    inOrder[start].lchild=k1;
    BinaryTree(m,k1,start-1);
    int k2=maxloc(start+1,n);
    inOrder[start].rchlid=k2;
    BinaryTree(start+1,k2,n);
}
int main()
{
    int m;
    int i,j;
    queue<int> st;
    cin>>m;
    for(i=0;i<m;++i)
    {
        cin>>postOrder[i];
    }
    for(i=0;i<m;i++)
    {
        cin>>inOrder[i].value;
    }
    for(i=0;i<m;++i)
    {
        for(j=0;j<m;j++)
        {
            if(inOrder[i].value==postOrder[j])
            {
                loc[i]=j;
                break;
            }
        }
    }
    int start=maxloc(0,m-1);
    BinaryTree(0,start,m-1);
    cout<<inOrder[start].value;
    i=1;
    do
    {
        if(inOrder[start].lchild>=0)
            st.push(inOrder[start].lchild);
        if(inOrder[start].rchlid>=0)
            st.push(inOrder[start].rchlid);
        if(!st.empty())
        {
            start=st.front();
            cout<<" "<<inOrder[start].value;
            ++i;
            st.pop();
        }

    }while(i!=m);//!!st.empty()当是5
                 //!               6 7 8 2 4
                 //!               6 7 8 4 2就会出错!!因为把7输出后queue为空,
                 //!                        故这个判断有误///
                 //!               结果4 8 2 7
    cout<<endl;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值