首页 > 其他分享 >23-4-27--二叉树--玩转二叉树

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

时间:2023-04-27 22:13:23浏览次数:43  
标签:lchild 27 -- int 二叉树 rchild NULL ptree

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

输入格式:

输入第一行给出一个正整数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);
    
}

结果如下:

 

标签:lchild,27,--,int,二叉树,rchild,NULL,ptree
From: https://www.cnblogs.com/daniel350-wang/p/17344195.html

相关文章

  • C++第四章课后练习题4-22
    1#include<iostream>2usingnamespacestd;3enumweekday{sunday,monday,tuesday,wednesday,thursday,friday,saturday4};5intmain()6{7inti;8weekdayd=thursday;9cout<<"d="<<d<<endl;10......
  • 找出SQLServer数据库I/O高的原因
    找出SQLServer数据库I/O高的原因影响SQLServer性能的因素有很多,比如CPU、I/O、内存、错误的执行计划、不恰当的索引或缺少索引等。当查询变慢时,我发现最常见的一件事是由于查询执行的I/O太大。当一个查询因为I/O而变慢时,可能是因为糟糕的硬件、糟糕的执行计划,但通常是糟糕的数据......
  • 函数重载
    函数形参不同:            intadd(intx,inty);            float add(floatx,floaty);形参个数不同:            intadd(intx,inty);            intadd(intx,i......
  • 2023 4 27
    2#include<iostream>3#include<string>4usingnamespacestd;5classShape6{7virtualvoidsetvalues()=0;8virtualvoidfloatarea()=0;9};10classrectangle:publicShape11{12public:13voidsetvalues()14......
  • 四月二十七日
    盒子模型(CSS重点)CSS三大模块:盒子模型、浮动、定位。盒子模型:就是把HTML页面中的元素看作是一个矩形的盒子,也就是一个盛装内容的容器。每个矩形都由元素的内容、内边距(padding)、边框(border)和外边距(margin)组成。​盒子边框(border)语法:border:border-width||border-style||......
  • 四月读书笔记1
    四月读书笔记1    《人月神话》告诉我们要管理一个项目,首先需要制定严格的进度表。而在现实的工作中,不少的项目在存有明确完成时间的前提下,往往是从预计完成时间倒推制定进度表——先设定几个节点,按照估计赋予它们预计完成的时间,然后各部门分头行动——定期或不定期的碰头......
  • C#高性能动态获取对象属性值的步骤
    动态获取对象的性能值,这个在开发过程中经常会遇到,这里我们探讨一下何如高性能的获取属性值。为了对比测试,我们定义一个类PeoplepublicclassPeople{publicstringName{get;set;}}然后通过直接代码调用方式来取1千万次看要花多少时间:privatestaticvoidDirectly......
  • 求某一个范围内完数的个数
    如果一个数等于它的因子之和,则称该数为完数,例如“6”的因子为1,2,3,而6=1+2+3,因此6是完数问题分析:假设一个数d,然后计算出它的每个因子,用到for循环,假如是a,b,c,然后进行一个判断如果a+b+c=d,就说明d是完数,应该要用到两层循环,最外层循环从2开始,一直到d,内层循环从1开始,一直到a,然后开始取余......
  • 程序员面试金典---17
    堆箱子思路:首先进行排序,规则为:如果宽度不相同,按照宽度从小到大排序。如果宽度相同,深度不相同,按照深度从大到小排序。宽度和深度都相同,高度从大到小排序。采用动态规划进行求解:计算以当前盒子为顶部盒子时的最大堆叠高度。从前往后遍历每一个盒子,对于每一个盒子i,遍......
  • Java-Day-16( 常用类 )
    Java-Day-16常用类包装类(Wrapper)针对八种基本数据类型定义相应的引用类型——包装类,有了类的特点,就可以调用类中的方法基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintIntegerlongLongfloatFloatdouble......