題意:
給你一個序列,要你建一個完全二叉排序樹,並輸出他的層次遍歷序列.
思路:
這個題目我覺得是一個特別好的題目.首先考慮到二叉排序樹的性質,二叉排序樹的中序遍歷得到的一定是一個遞增的有序序列,又因爲中序遍歷總是先左孩子然後自己,再右孩子所以這就保證通過中序遍歷建立的二叉排序樹一定是完全二叉樹.
那麼我們可以初始時先將序列排序變爲有序的,然後利用進行中序遍歷先左孩子再自己再右孩子,這個遍歷的過程中建樹即可.層次遍歷 利用二叉樹的性質 左孩子 2*i 右孩子 2*i+1,所以直接順序輸出即可.
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
int a[maxn],n,ans[maxn],cur;
void build(int pos)
{
if(pos > n) return ;
build(2*pos);
ans[pos] = a[cur++];
build(2*pos + 1);
return ;
}
int main()
{
scanf("%d",&n);
cur = 1;
for(int i = 1;i <= n;++i)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
build(1);
for(int i = 1;i <= n;++i)
{
printf("%d%c",ans[i],i == n?'\n':' ');
}
return 0;
}