PAT甲级 1064 Complete Binary Search Tree (30分) DFS中序遍历/C++

1064 Complete Binary Search Tree (30分)

题目大意:给定一串序列,要求构建完全二叉搜索树,输出层序遍历序列。

二叉搜索树:

  1. 左子树所有结点的值小于根结点的值;
  2. 右子树所有结点的值大于等于根结点的值;
  3. 左子树和右子树都满足前面两条要求。

首先要明确:把中序遍历的结果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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值