1110. Complete Binary Tree (25)

来源:互联网 发布:单片机控制mp3播放器 编辑:程序博客网 时间:2024/05/22 17:30


时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

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:
97 8- -- -- -0 12 34 5- -- -
Sample Output 1:
YES 8
Sample Input 2:
8- -4 50 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);}}

0 0
原创粉丝点击