23-4-27--二叉树--玩转二叉树

daniel350-wang / 2023-04-27 / 原文

给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

4 6 1 7 5 3 2

代码如下:

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

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

ptree premid(int pre[],int mid[],int size)
{
    if(size<=0)
    {
        return NULL;
    }
    int i;
    for(i=0;i<size;i++)
    {
        if(mid[i]==pre[0])
        {
            break;
        }
    }
    
    tree * t=new tree;
    t->date = pre[0];
    t->lchild = premid(pre+1,mid,i);
    t->rchild = premid(pre+i+1,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();
    } 
}

void treeswap(ptree t)
{
    if(t->lchild ==NULL&&t->rchild ==NULL)
    {
        return;
    }
    ptree tem=t->lchild ;
    t->lchild = t->rchild ;
    t->rchild = tem;
    if(t->lchild!=NULL)
    treeswap(t->lchild);
    if(t->rchild!=NULL)
    treeswap(t->rchild);
}

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

结果如下: