23-5-5--二叉树--树的遍历

daniel350-wang / 2023-05-05 / 原文

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。

输入格式:

输入第一行给出一个正整数N(30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。

输出格式:

在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。

输入样例:

7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
 

输出样例:

4 1 6 3 5 7 2

代码如下:

#include <iostream>
#include <queue>
using namespace std;

typedef struct tr* ptree;
typedef struct tr {
    int date;
    ptree lchild;
    ptree rchild;
}tree;

ptree postmid(int post[],int mid[],int size)
{
    if(size<=0)
    {
        return NULL;
    }
    int i;
    for(i=0;i<size;i++)
    {
        if(mid[i]==post[size-1])
        {
            break;
        }
    }
    ptree t=new tree;
    t->date = post[size-1];
    t->lchild = postmid(post,mid,i);
    t->rchild = postmid(post+i,mid+i+1,size-i-1);
    return t;
}

void floorprint(ptree node,int n)
{
    int cnt=0;
    queue <ptree> q;
    if(node==NULL)
    {
        return;
    }
    q.push(node);
    while(q.empty() ==false)
    {
        ptree t=q.front() ;
        if(t->lchild !=NULL)
        {
            q.push(t->lchild ) ;
        }
        if(t->rchild != NULL)
        {
            q.push(t->rchild );
        }
        cnt++;
        cout<<q.front()->date;
        if(cnt!=n)
        {
            cout<<" ";
        }
        q.pop();
    } 
}

int main()
{
    int n,post[40]={0},mid[40]={0};
    cin>>n;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&post[i]);
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&mid[i]);
    }
    ptree head=postmid(post,mid,n);
    floorprint(head,n);
}

结果: