Given a tree, you are supposed to tell if it is a complete binary tree.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤20) which is the total number of nodes in the tree – and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corresponds to a node, and gives the indices of the left and right children of the node. If the child does not exist, a - will be put at the position. Any pair of children are separated by a space.
Output Specification:
For each case, print in one line YES and the index of the last node if the tree is a complete binary tree, or NO and the index of the root if not. There must be exactly one space separating the word and the number.
Sample Input 1:
9
7 8
- -
- -
- -
0 1
2 3
4 5
- -
- -
Sample Output 1:
YES 8
Sample Input 2:
8
- -
4 5
0 6
- -
2 3
- 7
- -
- -
Sample Output 2:
NO 1
首先我一开始是不会怎么判断是不是完全二叉树= =,也不能说不会,一个是模糊,第二个也是不确定。
所以这题难度我觉的在于2点
1.怎么判断是不是完全二叉树
这里有两种情况
(1)只要是左子树为空,右子树不为空,就不是
(2)如果当前节点的右子树为空,那么从当前节点以后的节点必须为叶子节点,否则不是,(代码中有体现,虽然很简单的一点,但是我还是想了好长时间)
2.第二点因人而异,我做的时候再知道怎么判断完全二叉树的时候,还是只得了16分,愿意在于N<20,我是用char 读取的,考虑到右2位数的可能,所以要用string读入,这里还是和以前一样你可以用sscanf直接转换,也可以自己写一个函数转换,也不难
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
struct node{
int lchild,rchild;
}Node[25];
int n,flag=1,last;
int change(string c){
if(c == "-") return -1;
else {
int t=0;
for(int i=0;i<c.size();i++)
t=t*10+c[i]-'0';
return t;
}
}
bool bk[25]={false};
bool bfs(int root){
queue<int> q;
q.push(root);
int k=0,bkk=0;
while(!q.empty()){
int top = q.front();
q.pop();
k++;
if(k == n) last = top;
if(bkk){
if ( !(Node[top].lchild ==-1 && Node[top].rchild ==-1) )
return false;
}
if(Node[top].lchild ==-1 && Node[top].rchild !=-1){
return false;
}
if(Node[top].rchild ==-1 ) {
bkk=1;
}
if(Node[top].lchild !=-1) q.push(Node[top].lchild);
if(Node[top].rchild !=-1) q.push(Node[top].rchild);
}
return true;
}
int main(){
cin>>n;
string a,c;
for(int i=0;i<n;i++){
cin>>a>>c;
int aa=change(a);
int cc=change(c);
if(aa!=-1) {
Node[i].lchild = aa;
bk[aa]=true;
}
else Node[i].lchild =-1;
if(cc!=-1) {
Node[i].rchild = cc;
bk[cc]=true;
}
else Node[i].rchild = -1;
}
int root;
for(int i=0;i<n;i++){
if(!bk[i]){
root = i;
break;
}
}
if(!bfs(root)) cout<<"NO"<<' '<<root;
else cout<<"YES"<<' '<<last;
return 0;
}