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的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
特点:
- 完全二叉树只有最后一层可以不满,但除了最后一层,每一层的节点数必须是2^k-1
- 完全二叉树的最后一层中的节点必须向左靠拢
我们设想一下,给你一个后序遍历的结果,你能从该遍历结果得到两种完全二叉树吗?
下图中,虽然后序遍历的结果是一样的,但是只有左边的树是完全二叉树,右边不是完全二叉树
思路
我们按照后序遍历的过程,进行输出,就能得到完全二叉树后序遍历的结果
那么我们反过来,按照后序遍历的结果,进行输入,就能得到完全二叉树在数组中的存储位置
代码
一点说明:之所以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;
}