题意:
给你一串完全二叉搜索树的值,要求你输出该完全二叉搜索树的层序遍历。
分析:
由于是完全二叉搜索树,完全二叉搜索树的中序遍历,即为这组数值从小到大排序。之后递归得到层序遍历。
代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
vector<int>arr;
vector<int>res(1005);
int Getleftlength(int n){
int i=1;
while(1){
if(n<=pow(2,i)-1)
break;
i++;//求该数的层数
}
if(n-pow(2,i-1)>=pow(2,i-2))//判断最后一层的结点是否在右子树
return pow(2,i-1)-1;
else
return n-pow(2,i-2);
}
void solve(int left,int right,int root){
int n=right-left+1;
if(n==0)
return;
int l=Getleftlength(n);//求左子树规模
res[root]=arr[left+l];
int leftchild=2*root+1;
int rightchild=leftchild+1;
solve(left,left+l-1,leftchild);
solve(left+l+1,right,rightchild);
}
int main(){
int n;
scanf("%d",&n);
for(int i=0,t;i<n;++i){
scanf("%d",&t);
arr.push_back(t);
}
sort(arr.begin(),arr.end());
solve(0,n-1,0);
for(int i=0;i<n;++i){
if(i)
cout<<" ";
cout<<res[i];
}
return 0;
}