判断完全二叉树
题目描述:
给定一棵树,你应该指出它是否是一个完全二叉树。
输入:
对于每种情况,第一行给出正整数N(≤20),它是树中节点的总数(节点从0到N-1编号)。 然后是N行,第i行对应一个节点i,并给出节点i左右子节点的索引。 如果孩子不存在,则 - 将被置于该位置。
输出:
对于每种情况,如果树是完全二叉树,则在一行中打印YES和层序遍历的最后一个节点的索引,或者如果不是,则打印NO和根的索引。 必须有一个空格分隔单词和数字。
样例
9
7 8
- -
- -
- -
0 1
2 3
4 5
- -
- -
输出
YES 8
代码
#include<iostream>
#include<queue>
using namespace std;
struct Node{
char left,right;
};
int main(){
int n;
cin>>n;
Node* ntr=new Node[n];
bool* root=new bool[n];
for(int i=0;i<n;i++) root[i]=true;
char x,y;
for(int i=0;i<n;i++){
cin>>x>>y;
ntr[i].left=x;
ntr[i].right=y;
if(x!='-') root[(int)(ntr[i].left)-48]=false;
if(y!='-') root[(int)(ntr[i].right)-48]=false;
}
queue<char> Q;
for(int i=0;i<n;i++){
if(root[i]){
int flag=0;
Q.push((char)(i+48));
char fro=Q.front();
char last='-';
while(fro!='-'){
Q.push(ntr[(int)(fro)-48].left);
Q.push(ntr[(int)(fro)-48].right);
Q.pop();
last=fro;
fro=Q.front();
}
while(!Q.empty()){
if(Q.front()!='-'){
flag--;
break;
}else{
Q.pop();
}
}
flag++;
if(flag==0){
cout<<"NO "<<i<<endl;
}else{
cout<<"YES "<<last<<endl;
}
}
}
return 0;
}