#include<iostream>
#include<algorithm>
using namespace std;
int n=0,k;
int a[1000]={0};
int b[1000]={0};
bool compare(int a,int b)
{
return a<b;
}
int dg(int root)
{
if(root>n) return 0;
int l=2*root;
int r=2*root+1;
dg(l);
b[root]=a[k++];
dg(r);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n,compare);
k=0;
dg(1);
printf("%d",b[1]);
for(int i=2;i<=n;i++)
{
printf(" %d",b[i]);
}
return 0;
}
思路:
满二叉树各个节点的位置数(层序遍历):
left=2*root;
right=2*root+1;
其中一层中节点个数等于最右边节点的位置数,也就是2的层数次方
参照以上知识点,按照中序遍历的方法(左根右)建立该满二叉树
递归代码如下:
int dg(int root) { if(root>n) return 0;//寻找叶子节点 int l=2*root;//左子树位置 int r=2*root+1;//右子树位置 dg(l);//中序遍历:左 b[root]=a[k++];//中序遍历:中 dg(r);//中序遍历:右 }最后记得:数据从小到大排列的顺序也就是二叉搜索树的中序遍历的顺序。