1. 完全二叉树的建立
例题:完全二叉树的层序遍历
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 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
解题思路都在代码中了,请看代码
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<queue>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int tree[33];//用数组模拟树
int a[33];
int book[100];
int n,m;//m是n的副本,不改变n的大小,改变m的大小
void build(int idx)//完全二叉树的下标
{
if(book[idx]==0)//证明该树上的改结点可以放值
{
tree[idx]=a[m--];
book[idx]=INF;//又不可以放了
// return;
}
if(book[idx*2+1]==0)
build(idx*2+1);
if(book[idx*2]==0)
build(idx*2);
}
int main()
{
int i;
while(~scanf("%d",&n))
{
m=n;
memset(book,INF,sizeof(book));//树上的每一个结点都被标记成了无穷大,即该结点不能被放任何值
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
book[i]=0;//标记为0,证明可以放值了
}
build(1);//构建完全二叉树
for(i=1;i<=n;i++)
{
if(i==1)
printf("%d",tree[i]);
else
printf(" %d",tree[i]);
}
printf("\n");
}
return 0