原题:1064. Complete Binary Search Tree (30)
解题思路:
考察二叉搜索树和完全二叉树的性质,实际上所有数据从小到大就是二叉搜索树的中序遍历,而完全二叉树用数组保存又有左右子树的编号为root*2与root*2+1的性质,并且用数组保存的完全二叉树中间是不会有空结点的,应用这两个性质递归构造完全二叉树即可。
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1000 + 5;
int inOrder[maxn];
int tree[maxn], n;
void construct(int root, int& p)
{
if(root > n) return; //边界条件
construct(root*2, p);//构造左子树
tree[root] = inOrder[p++];//数据填入根
construct(root*2+1, p);//构造右子树
}
int main()
{
while(scanf("%d", &n) == 1)
{
for(int i = 1; i <= n; i++)
scanf("%d", &inOrder[i]);
sort(inOrder+1, inOrder+n+1);
int p = 1;
construct(1, p);
for(int i = 1; i <= n; i++)
if(i == 1) printf("%d", tree[i]);
else printf(" %d", tree[i]);
printf("\n");
}
return 0;
}