PAT甲级 1099 Build A Binary Search Tree (30分) DFS(中序)/C++

1099 Build A Binary Search Tree (30分)

DFS(中序遍历)

题目大意:给定一棵结构已构建好的树,给定一串序列,要求按照二叉搜索树的规则将序列中的数字填入树框架中,再按层次遍历。

  1. 首先需要明确的是:把中序遍历的结果push_back到数组v1里面,直接输出就是中序,排序输出就是层序(排序方式,层数小的排前面,相同层数时,index大的排前面
  2. 先将序列从小到大排序,得到中序序列;再中序遍历(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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值