问题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805407749357568
题意:
给出N个非负整数,要用它们构建一颗完全二叉排序树。输出这棵完全二叉排序树的层序遍历序列。
思路:
- 如果使用数组来存放完全二叉树,那么对完全二叉树当中的任何一个结点(设编号为x,根节点编号为1),其左孩子结点的编号为2*x,右孩子结点编号为2*x+1。则可以开一个数组CBT[maxn],其中CBT[1]~CBT[N]按层序存放完全二叉树的N个结点,这个数组就存放了,一颗没有对其元素进行赋值的完全二叉树。
- 二叉排序树中序遍历序列是递增的,所以将输入的数字从小到大排序,然后对CBT数组表示的二叉树进行中序遍历,并在遍历过程中将数字从小到大填入数组,最后就能得到一颗完全二叉排序树。
- CBT数组是按二叉树的层序存放结点的,因此将数组元素按顺序输出即为层序遍历序列。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1010;
int N;
int in[maxn];
int CBT[maxn];
int num = 0;//记录in[]数组下标
void inorder(int x){
if(x < 1 || x > N)
return;
inorder(2 * x);
CBT[x] = in[num++];
inorder(2 * x + 1);
}
int main(){
cin >> N;
for(int i = 0; i < N; i++)
cin >> in[i];
sort(in, in + N);//将输入从小到大排序后,in[]数组中保存的即为树的中序遍历序列
inorder(1);//1号位为根节点
for(int i = 1; i <= N; i++)//层序输出完全搜索二叉树
{
cout << CBT[i];
if(i < N)
cout << " ";
}
return 0;
}