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 8Sample Input 2:
8 - - 4 5 0 6 - - 2 3 - 7 - - - -Sample Output 2:
NO 1
看了柳婼的代码 ,瞬间觉得我写的好烂。。。
首先建树。根据完全二叉树的性质:最后一个有孩子的节点下标为n/2(下标从1开始),那么之前的结点一定都有左右孩子,后面的一定没有孩子,当前节点有没有右孩子由n的奇偶性决定。
一开始偷懒用isdigit(),后来才发现N<=20.。。。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node{
int left;
int right;
}stu[25];
int main(){
int n,i;
char s1[3],s2[3];
scanf("%d",&n);
int mark[n];
for(i=0;i<n;i++){
mark[i]=0;
}
getchar();
for(i=0;i<n;i++){
stu[i].left=stu[i].right=-1;
scanf("%s %s",s1,s2);//n<=20.....
if(strlen(s1)==2){
stu[i].left=(s1[0]-'0')*10+s1[1]-'0';
mark[stu[i].left]=1;
}
else{
if(s1[0]!='-'){
stu[i].left=s1[0]-'0';
mark[stu[i].left]=1;
}
}
if(strlen(s2)==2){
stu[i].right=(s2[0]-'0')*10+s2[1]-'0';
mark[stu[i].right]=1;
}
else{
if(s2[0]!='-'){
stu[i].right=s2[0]-'0';
mark[stu[i].right]=1;
}
}
getchar();
}
int root;
for(i=0;i<n;i++){
if(mark[i]==0){
root=i;break;
}
}
queue<int>q;
q.push(root);
int cou=0,flag=1,last;
while(!q.empty()){
cou++;
int head=q.front();
q.pop();
if(cou==n){
last=head;
}
if(cou<n/2){
if(stu[head].left==-1||stu[head].right==-1){
flag=0;break;
}
}
else if(cou==n/2){
if(n%2==0){
if(stu[head].left==-1||stu[head].right!=-1){
flag=0;break;
}
}
else{
if(stu[head].left==-1||stu[head].right==-1){
flag=0;break;
}
}
}
else if(cou>n/2){
if(stu[head].left!=-1||stu[head].right!=-1){
flag=0;break;
}
}
if(stu[head].left!=-1){
q.push(stu[head].left);
}
if(stu[head].right!=-1){
q.push(stu[head].right);
}
}
if(flag==1){
printf("YES %d",last);
}
else{
printf("NO %d",root);
}
}
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<queue>
using namespace std;
struct node{
int left;
int right;
}tree[30];
int mark[30]={0};
int last;
int judge(int root,int n){
queue<int>q;
q.push(root);
int i,cou=0;
while(!q.empty()){
cou++;
if(cou>n){
return 1;
}
int head=q.front();
last=head;
q.pop();
if(head==-1&&cou<=n){
return 0;
}
q.push(tree[head].left);
q.push(tree[head].right);
}
}
int main(){
int n,i;
char s1[4],s2[4];
scanf("%d",&n);
for(i=0;i<n;i++){
tree[i].left=tree[i].right=-1;
scanf("%s %s",s1,s2);
if(strlen(s1)==2){
tree[i].left=(s1[0]-'0')*10+s1[1]-'0';
}
else if(isdigit(s1[0])){
tree[i].left=s1[0]-'0';
}
if(strlen(s2)==2){
tree[i].right=(s2[0]-'0')*10+s2[1]-'0';
}
else if(isdigit(s2[0])){
tree[i].right=s2[0]-'0';
}
if(tree[i].left!=-1){
mark[tree[i].left]=1;
}
if(tree[i].right!=-1){
mark[tree[i].right]=1;
}
// getchar();
}
int root;
for(i=0;i<n;i++){
if(mark[i]==0){
root=i;break;
}
}
int flag=judge(root,n);
if(flag){
printf("YES %d",last);
}
else{
printf("NO %d",root);
}
}