L2-3 完全二叉树的层序遍历 (25分)
## 比赛的时候差一点就完成了,所以写个博客了却一下自己的遗憾。
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 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
作者 陈越
单位 浙江大学
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
解题思路
递归创建完全二叉树
因为是后序遍历所以我们应该从遍历结果的后面开始插入
91 71 2 34 10 15 55 18
首次创建一个完全二叉树的数组(根据完全二叉树的定义)
1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0
1.插入根节点
2.先插入左孩子
3.计算当前节点的孩子节点存在调用递归插入该节点的左孩子
4.当前节点无孩子节点,插入右孩子
5.当前节点无孩子节点,该次递归结束,返回调用处,插入节点的右孩子
6.继续同样的递归步骤
代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int *b,*a,n,begin;
int xv;
void put_tree(int xv){//后序递归插入
int xc;
if(begin<0)//插入结束
return ;
if(xv*2>n){//当前节点无孩子节点可以插入
begin++;
return ;
}
if(xv*2+1<=n){
b[xv*2+1]=a[begin];
begin--;
put_tree(xv*2+1);//递归插入左孩子节点
begin--;}
b[xv*2]=a[begin];
begin--;
put_tree(xv*2);//递归插入右孩子节点
}
int main(){
int i,xc;
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);//后序输入
b=(int *)malloc(sizeof(int)*(n+1));
b[1]=a[n-1];//放入根节点
begin=n-2;
put_tree(1);
printf("%d",b[1]);
for(i=2;i<=n;i++)//输出
if(b[i]!=0)
printf(" %d",b[i]);
else
break;
printf("\n");
}