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;
}
posted @ 2026-03-16 21:57  shuiwangrenjia  阅读(105)  评论(0)    收藏  举报