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;
}