首页 > 其他分享 >23-4-18--二叉树--完全二叉树的层序遍历

23-4-18--二叉树--完全二叉树的层序遍历

时间:2023-04-18 20:49:03浏览次数:38  
标签:结点 遍历 23 -- 层序 tree int 二叉树

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度完美二叉树的层序遍历的前 N 个结点,这样的树就是完全二叉树。

给定一棵完全二叉树的后序遍历,请你给出这棵树的层序遍历结果。

输入格式:

输入在第一行中给出正整数 N(≤30),即树中结点个数。第二行给出后序遍历序列,为 N 个不超过 100 的正整数。同一行中所有数字都以空格分隔。

输出格式:

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

输入样例:

8
91 71 2 34 10 15 55 18
 

输出样例:

18 34 55 71 2 10 15 91

思路:

对于完全二叉树的层序遍历,有这样一个特点:如果用一个数组tree[]存放层序遍历的结果的话,若从tree[1]开始存放根节点,那么对于任意节点tree[i],它的左结点为tree[2*i],它的右结点为tree[2*i+1],那么再根据后序遍历的特点,就可以递归地根据后序遍历结果得到层序遍历结果。

dfs的顺序和后序遍历的顺序非常相似。

代码如下:

#include <iostream>

using namespace std;
int t=1,n,a[35],tree[35];
void dfs(int h)
{
    if(h>n)
    {
        return;
    }
    int l=h*2;
    int r=h*2+1;
    dfs(l);    //递归左子树
    dfs(r);    //递归右子树
    tree[h]=a[t]; //那么剩下的a[t]
    t++;
}

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    dfs(1);
    for(int i=1;i<=n;i++)
    {
        cout<<tree[i];
        if(i!=n)
        {
            cout<<' ';
        }
    }
    cout<<endl;
}

提交结果:

 

 

 

标签:结点,遍历,23,--,层序,tree,int,二叉树
From: https://www.cnblogs.com/daniel350-wang/p/17331009.html

相关文章

  • V90 伺服电机 交流
    伺服驱动器+ 伺服电机Prifinet PN 通讯方式控制 20针编码器:绝对编码/增量型编码V90 PTI 走脉冲 50针 profinet:1200RT 无等时同步功能1500 IRT 等时同步功能  新设备需要profinet通讯时,厂家索要gsd文件,下载到博途中,使用博途加载。分布式IO:连接到主站......
  • LAL v0.35.4发布,OBS支持RTMP H265推流,我跟了
    Go语言流媒体开源项目LAL今天发布了v0.35.4版本。LAL项目地址:https://github.com/q191201771/lal老规矩,简单介绍一下:▦一.OBS支持RTMPH265推流新出的标准,一般被称为enhancedRTMP,OBS新版(29.1+版本,点我去下载安装包)已经实现可以使用,LAL也做了相应的适配,换言之,你可以......
  • 定义一个User结构体
    d:一个数字,每个用户不同的idemail:email地址,一般网站的用户允许以email地址登录gender:性别,男or女QQ:QQ号码写一个函数,在User数组中查找某个id的User函数描述:User*find(User*all,intn,intid);其中,all:输入一个User数组n:数组长度id:待查找的id#include<iostream>......
  • 借书方案知多少解决思路及代码
    问题描述:      小明有5本新书,要借给A,B,C这三位小朋友,若每次每人只能借一本,则可以有多少种不同的借法?设计思路:      1.将5本书从1-5编号,三个人设为i,j,k。因为每人一本且不重复则满足i!=j!=k      2.从第一个人开始枚举,首先确定i的值,然后确定j的值,最后确定k......
  • 第 1 篇 Scrum 冲刺博客
    第1篇Scrum冲刺博客这个作业属于哪个课程软件工程这个作业要求在哪里作业要求作业目标各个成员在Alpha阶段认领的任务,明日各个成员的任务安排,整个项目预期的任务量,敏捷开发前的感想,团队期望目录第1篇Scrum冲刺博客1、Alpha阶段任务分配2、明日各个成员任......
  • 4.18 1.2
    一、问题描述5本书分给A、B、三人,每次只能分一本,几种分法。二、思路A可选1,2,3,4,5。B可选4本。C可选3本。 后一个人都会受到前一个人的限制,用三层循环。 三、代码#include<iostream>usingnamespacestd;intmain(){ inta,b,c;//表示三人的书编号inti=0;//i表示借阅次......
  • 折半查找
    N个有序整数数列已放在一维数组中,利用二分查找法查找整数m在数组中的位置。若找到,则输出其下标值;反之,则输出“Notbefound!”。由于我们将数存入数组当中,我们可以先设置最大值下标和最小值下标,通过下标表示数值,现将要找的数与最中间的数进行比较,若要找的数大,则在最中间的数和最大......
  • Linux基础命令
    目录一、关机或重启命令二、显示当前所在路径,显示当前路径下的所有内容三、基础命令touch、cat、echo四、基础命令cp、mv、rm五、切换目录六、创建目录结构七、编辑相关命令八、如何建立软连接?一、关机或重启命令'''参数介绍-h(hour小时的意思后面跟具体时间12:30常用-h0......
  • 5
     #include<iostream>#include<cmath>usingnamespacestd;intmain(){ floatfact(floata,floatb,floatc,floatd);//定义 floata,b,c,d,x; cout<<"请输入方程的系数:"<<endl; cin>>a;//输入系数 cin>>b; cin>>c; cin>>d......
  • 【线程基础】【一】线程的创建方式
    1 前言本节开始我们来回顾下线程基础相关的东西,最近在复习所以来做一些笔记哈,这节我们来讲讲创建线程的方式。2 创建分类Java提供了两种线程的创建方法,第一种是继承Thread类;第二种是实现Runable接口,并将Runnable实例传递给Thread类。详细的可以参考官方文档哈:https://docs.......