L2-2 完全二叉树的层序遍历

L2-2 完全二叉树的层序遍历

一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 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

提示

按照管理,我们是很难从后序遍历转化到层序遍历的,因为我们都知道,如果光给一个遍历结果,得到的树结构可能有多种多样!
但是,此题说的是完全二叉树,下面是完全二叉树的定义以及特点:

定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
特点:

  1. 完全二叉树只有最后一层可以不满,但除了最后一层,每一层的节点数必须是2^k-1
  2. 完全二叉树的最后一层中的节点必须向左靠拢

我们设想一下,给你一个后序遍历的结果,你能从该遍历结果得到两种完全二叉树吗?
下图中,虽然后序遍历的结果是一样的,但是只有左边的树是完全二叉树,右边不是完全二叉树
在这里插入图片描述

思路

我们按照后序遍历的过程,进行输出,就能得到完全二叉树后序遍历的结果
那么我们反过来,按照后序遍历的结果,进行输入,就能得到完全二叉树在数组中的存储位置

代码

一点说明:之所以dfs的根节点取1,是因为如果取0的话,那么左儿子左边为2*0=0还是根节点。所以应当取1开始

#include<iostream>
using namespace std;
int n, k;
int* tree;
void dfs(int index) {
    if(index <= n) {
        dfs(index * 2);
        dfs(index * 2 + 1);
		cin>>tree[index];
    }
}
int main() {
    cin>>n;
    tree = new int[n+1];
    dfs(1);
    for(int i = 1 ; i <= n ; i++)
        cout<<tree[i]<<(i == n ? "\n" : " "); 
    return 0;
}
  • 12
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「江太白」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值