2021-4-9天梯赛补题(完全二叉树的层序遍历)

Posted 如风如影�

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-4-9天梯赛补题(完全二叉树的层序遍历)相关的知识,希望对你有一定的参考价值。

完全二叉树的层序遍历

题目链接: link.

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

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

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

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

这个题目已经告诉该树是完全二叉树,所以完全二叉树的性质可以直接拿来用,如果当前结点为i,那么左子树结点就为2i,右子树结点为2i+1,完全二叉树除了叶子结点,每个结点的度都为2。
该题与常规思路不同的是,告诉了后序遍历,从最后开始先赋地址。

#include <bits/stdc++.h>
using namespace std;
struct node
   int data;
   int lc,rc;
arr[35];
void creat(int n)//类似于后序遍历

     if(arr[n].lc) creat(arr[n].lc);//先一直沿着左子树递归,没有左儿子之后输入最后的值,然后再看当前的右儿子。
     if(arr[n].rc) creat(arr[n].rc);//判断完这一层递归之后,返回上一次调用它的那一层
     scanf("%d",&arr[n].data);

int main()

   int n;
   cin>>n;
   for(int i=1;i<=n;i++)
   
      if(i*2<=n) arr[i].lc=i*2;//给树赋结点地址
      if(i*2+1<=n) arr[i].rc=i*2+1;
   
   creat(1);
   for(int i=1;i<=n;i++)
   
      if(i==n) cout<<arr[i].data<<endl;
      else cout<<arr[i].data<<' ';
   

   return 0;

以上是关于2021-4-9天梯赛补题(完全二叉树的层序遍历)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode二叉树的层序遍历

PTA 7-5 完全二叉树的层序遍历

PTA 7-5 完全二叉树的层序遍历

PTA 7-5 完全二叉树的层序遍历

PTA 7-5 完全二叉树的层序遍历

天梯 - 是否完全二叉搜索树(判断序列插完是否是完全二叉树,并求出层序遍历)