1064 Complete Binary Search Tree (30分)
题目大意:给定一串序列,要求构建完全二叉搜索树,输出层序遍历序列。
二叉搜索树:
- 左子树所有结点的值小于根结点的值;
- 右子树所有结点的值大于等于根结点的值;
- 左子树和右子树都满足前面两条要求。
首先要明确:把中序遍历的结果push_back到数组v1里面,直接输出就是中序,排序输出就是层序(排序方式,层数小的排前面,相同层数时,index大的排前面
而二叉搜索树的中序遍历结果就是从小到大排列的。
PAT甲级中用到同种方法的题目:1127 ZigZagging on a Tree (30分)、1099 Build A Binary Search Tree (30分)(非常类似)(附:题解:1099 Build A Binary Search Tree (30分)、题解:1127 ZigZagging on a Tree (30分))
#include<iostream> //输入输出流头文件
#include<algorithm> //C++标准模板库的函数
#include<vector> //变长数组容器
using namespace std; //标准命名空间
vector<vector<int>> level;
vector<int> seq;
int cmp(int a,int b){
return a<b;
}
int n,in=0,lev=0;
void dfs(int r,int l);
int main(){ //主函数
cin>>n;
seq.resize(n);
level.resize(n);
for(int i=0;i<n;i++)cin>>seq[i];
sort(seq.begin(),seq.end(),cmp);
dfs(0,0);
for(int i=0;i<=lev;i++){
for(int j=0;j<level[i].size();j++){
cout<<level[i][j];
if(i==lev&&j==level[i].size()-1) cout<<endl;
else cout<<' ';
}
}
return 0; //返回0,如果不返回0,PAT会报错
}
void dfs(int r,int l){
if(l>lev)lev=l;//更新最大层次
if((r*2+1>=n)&&(r*2+2)>=n){//叶子结点
level[l].push_back(seq[in++]);
return ;
}
if(r*2+1<n) dfs(r*2+1,l+1);
level[l].push_back(seq[in++]);
if(r*2+2<n) dfs(r*2+2,l+1);
}