题目链接:点击打开链接
题目大意:略。
解题思路:完全二叉树有这么一个性质,若 a 节点的下标为 i,那么它左儿子的下标为 2i,右儿子为 2i+1. 而这个下标则为完全二叉树在层序遍历时的输出顺序。而对于任意一棵搜索树,其中序遍历的输出,是一个递增的数列。根据这两个性质,可以有如下算法。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n,l;
int a[1005], rs[1005];
void dfs(int rt)
{
if(rt<=n)
{
dfs(2*rt);
rs[rt]=a[l++];
dfs(2*rt+1);
}
}
int main()
{
while(~scanf("%d",&n))
{
l=0;
for(int i=0;i<n;i++) scanf("%d",&a[i]);
sort(a,a+n);
dfs(1);
printf("%d",rs[1]);
for(int i=2;i<=n;i++) printf(" %d",rs[i]);
}
return 0;
}