这道题目就很不错啦。
完全二叉排序树按层序存放在从1开始的数组中,左右儿子节点的索引分别为(根节点索引假设为root)root*2和root*2+1。而二叉排序树的中序遍历是递增的。我们现在把输入序列排序,就可以得到中序遍历的序列了。于是我们开始遍历这棵左右儿子节点的索引分别为(根节点索引假设为root)root*2和root*2+1的空树,与以往一边遍历一边打印不同的是,我们是一边遍历,一边给这棵空树赋值。
不是水题。很不错。学习这种思想。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int maxn = 1010;
int n,number[maxn],cbt[maxn], index = 0;
void inorder(int root)
{
if(root>n)
return;
inorder(root*2);
cbt[root]=number[index++];
inorder(root*2 + 1);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&number[i]);
}
sort(number,number+n);
inorder(1);
for(int i=1;i<=n;i++){
printf("%d", cbt[i]);
if(i<n)
printf(" ");
}
return 0;
}