PAT甲级 1110 Complete Binary Tree (25分) 层序遍历/C++

1110 Complete Binary Tree (25分)

判断是否为完全二叉树,我用的是层序遍历的方式进行判断。

题目大意:判断输入的树是否为完全二叉树,如果是,输出YES和最后一个结点,如果不是,输出NO和根结点。

tips:输入的时候,不能用char!!!(因为输入存在两位数) 开始时因为忽略了这个(测试点234),想了特别久为什么呢到底是为什么呢?QWQ

层序遍历过程中,如果出现空结点,后面应当没有结点,若出现新结点说明不是完全二叉树。

#include<iostream>                  //输入输出流头文件
#include<string>
#include<queue>                     //队列
using namespace std;                //标准命名空间
struct binaryTree{
	int left;
	int right;
};
int n;
 binaryTree t[20];
int isBinaryTree(int r);
int main(){                         //主函数
#ifdef ONLINE_JUDGE                 //如果有oj系统(在线判定),则忽略文件读入,否则使用文件作为标准输入
#else    
   freopen("1.txt", "r", stdin);   //从1.txt输入数据
#endif 
   cin>>n;
   int *flag=new int[n];
   for(int i=0;i<n;i++){
	  string l,r;
	   cin>>l>>r;
	   if(l!="-"){
			t[i].left=stoi(l);
			flag[t[i].left]=1;
	   }
	   else t[i].left=-1;
	   if(r!="-"){
			t[i].right=stoi(r);
			flag[t[i].right]=1;
	   }
	   else t[i].right=-1;
   }
   int i=0;
   for(;i<n;i++){
	   if(flag[i]!=1) break;
   }
  int s= isBinaryTree(i);
  if(s==-1) cout<<"NO "<<i<<endl;
  else cout<<"YES "<<s<<endl;
    return 0;                       //返回0,如果不返回0,PAT会报错
}
int isBinaryTree(int r){
	queue<int> q;
	int flag=0;
	q.push(r);
	while(!q.empty()){
		if(flag==1){
			if(t[r].left!=-1||t[r].right!=-1) return -1;
		}
		else{
			if(t[r].left!=-1)q.push(t[r].left);
			else flag=1;
			if(flag==0){
				if(t[r].right!=-1) q.push(t[r].right);
                else flag=1;
			}
			else if(t[r].right!=-1) return -1;//不是完全二叉树
		}
		q.pop();
		if(!q.empty())r=q.front();
	}
	return r;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值