L2-035 完全二叉树的层序遍历
题目描述
完美二叉树的定义是: 对于一个二叉树,如果每一层的节点数都达到最大,就是完美二叉树。
完全二叉树的定义是: 对于一个二叉树,如果其层序遍历与相同深度的完美二叉树的层序遍历的前N个数相同,就是完全二叉树。可以看做残缺的完美二叉树。
输入格式
第一行给出正整数n,随后给出完全二叉树的后序遍历,大小为n。
输出格式
输出该完全二叉树的层序遍历结果
解题思路
完全二叉树的结构固定 , 对每个非叶节点 i, 它的左儿子 为 2 * i , 它的右儿子为 2 * i + 1 。
后序遍历的过程就是dfs函数,先遍历左子树,再遍历右子树,最后回到根,所以我们可以按这个顺序去填充完全二叉树.
后序遍历时是拿,现在是放,只需要把拿的行为变成放(😮创新思维了属于是)
//这里的dfs函数的作用是给当前节点填数
dfs(2*u);//先填左子树
dfs(2*u+1);//再填右子树
//最后填根节点(每个子树的根)
tree[u] = post[curr++];//怎么放进后序遍历数组,就怎么拿出来
//如果是给出树的层序遍历结果,去求后序遍历结果
post[u] = tree[curr++];
由这种思路可以举一反三 :
- 前序填充,只需要将放的过程移至两次递归前
- 中序,移至中间
- 镜像反转,两次递归调换
ac✅️代码
#include<iostream>
using namespace std;
int post[40];
int tree[40];
int n;
int cur = 0 ;
void build(int i)
{
if(i > n) return ;
build(2 * i);
build(2 * i + 1);
tree[i] = post[cur++];
}
int main()
{
cin>>n;
for(int i = 0 ; i < n ; i++) cin>>post[i];
build(1);//建树从1开始,这里与post从哪开始无关
for(int i = 1 ; i <= n ; i ++)
{
cout<<tree[i];
if(i != n) cout<<" ";
}
cout<<endl;
return 0;
}

浙公网安备 33010602011771号