1099 Build A Binary Search Tree (30分)
DFS(中序遍历)
题目大意:给定一棵结构已构建好的树,给定一串序列,要求按照二叉搜索树的规则将序列中的数字填入树框架中,再按层次遍历。
- 首先需要明确的是:把中序遍历的结果push_back到数组v1里面,直接输出就是中序,排序输出就是层序(排序方式,层数小的排前面,相同层数时,index大的排前面
- 先将序列从小到大排序,得到中序序列;再中序遍历(DFS)给定的树(框架),同时记录所在层次,并把对应层次的结点记录在vector中。
在PAT甲级中,用到同种方法的题目:1127 ZigZagging on a Tree (30分)、1064 Complete Binary Search Tree (30分)(题解:1127 ZigZagging on a Tree (30分) 以及 题解:1064 Complete Binary Search Tree (30分))
#include<iostream> //输入输出流头文件
#include<algorithm> //C++标准模板库的函数
#include<vector> //变长数组容器
using namespace std; //标准命名空间
struct bst{
int left,right;
};
bst t[100];
vector<vector<int>> level;//存放对应层次的结点
vector<int> seq;//序列
int cmp(int a,int b){
return a<b;
}
int n,in=0,lev=0;//结点数n,中序序列下标in,最大层次lev
void inorder(int r,int l);
int main(){ //主函数
cin>>n;
seq.resize(n);
level.resize(n);
for(int i=0;i<n;i++) cin>>t[i].left>>t[i].right;
for(int i=0;i<n;i++) cin>>seq[i];
sort(seq.begin(),seq.end(),cmp);
inorder(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 inorder(int r,int l){//中序遍历
if(lev<l)lev=l;//更新最大层次
if(t[r].left==-1&&t[r].right==-1){//叶子结点
level[l].push_back(seq[in++]);
return ;
}
if(t[r].left!=-1) inorder(t[r].left,l+1);
level[l].push_back(seq[in++]);
if(t[r].right!=-1)inorder(t[r].right,l+1);
}