#include <iostream>
#include <algorithm>
using namespace std;
int tree[1005],num[1005],N;
static int index=0;
//中序遍历
void InorderTraversal(int node)
{
if(node>N)
return;
InorderTraversal(2*node);
tree[node]=num[index++];
InorderTraversal(2*node+1);
}
int main()
{
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%d",&num[i]);
sort(num,num+N);
InorderTraversal(1);
printf("%d",tree[1]);
for(int i=2;i<=N;i++)
printf(" %d",tree[i]);
return 0;
}
此题的解题思路:
1.完全二叉树的节点下标的性质: 左孩子的下标为父亲节点的下标*2,右孩子的下标为父亲节点的下标*2+1。
2.二叉搜索树的中序遍历输出结果是一个升序的序列。
通过这两条性质我们能得到解题思路,首先将题目给的序列进行升序排序,再通过中序遍历的方式构造二叉树,左右子节点的下标通过性质1可知,在递归时会用上。
题目想要求解的是我们构造出来的树的层次遍历(BFS),想想为什么直接存在tree[]里的每个节点的值已经是层次遍历了(还是与第一条性质有关)。
我们在对这棵树标下标的时候就是按照层次遍历的顺序来标的,然后通过性质1得到子节点和父节点的倍数关系去构造二叉树,
因此构造完成后数组默认就是层次遍历的排序方式。