天梯赛 L2-3 完全二叉树的层序遍历

世界杯365体育 时间: 2026-06-24 16:05:27 作者: admin 查阅次数: 6082 公众评价: 434
天梯赛 L2-3 完全二叉树的层序遍历

文章目录

题目描述输入输出数据范围样例

想法实现

题目描述

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

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

输入

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

输出

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

数据范围

对于30%的数据,n不超过2147483647; 对于100%的数据,n的位数不超过18。

样例

输入: 8 91 71 2 34 10 15 55 18 输出: 18 34 55 71 2 10 15 91

想法

之前只知道给出中序序列和前序序列/后序序列/层序序列可以重建这棵二叉树 而这个题只给了后序序列,怎么办呢? 我们发现还有完全二叉树这一条件,而完全二叉树有一个很好的性质: 有了这一性质, 我们便可以根据后序序列进行递归建树, 在建树的过程中,便可得到层序遍历序列

实现

#include

#include

#include

using namespace std;

const int N = 39;

int n, cnt1, cnt2;

int num[N]; // 后序序列

int ans[N]; // 层序序列

void postOrder(int index)

{

if(index > n || index < 1) return;

ans[index] = num[cnt1--];

postOrder(2*index + 1); // 右子树

postOrder(2*index); // 左子树

}

int main()

{

cin >> n;

cnt1 = n;

for(int i=1; i<=n; i++)

cin >> num[i];

postOrder(1); // 根据完全二叉树的性质, 通过后序序列进行建树

for(int i=1; i<=n; i++)

{

if(i!=1) cout << " ";

cout << ans[i];

}

return 0;

}

关联

长城[1080p]
世界杯365体育

长城[1080p]

📅 09-05 👁️ 4185
陈子豪直播平台介绍
365速度发国际大厅

陈子豪直播平台介绍

📅 09-14 👁️ 3886
中国女排全胜战绩夺2019女排世界杯冠军
365速度发国际大厅

中国女排全胜战绩夺2019女排世界杯冠军

📅 07-24 👁️ 8432

链接