1110. Complete Binary Tree (25) <完全二叉树>

来源:互联网 发布:草东没有派对知乎 编辑:程序博客网 时间:2024/05/16 00:27

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

判断是否为完全二叉树
注意输入的结点不一定是个位数。。我直接a-‘0’来做。错了一大堆
可以直接用sscanf(a,"%d",sum) 将字符串格式化为整形赋值给sum
如果出现空的结点,判断是否已经遍历完树,遍历结束就是YES,反之为NO
#include<cstdio>#include<cmath>#include<algorithm>#include<iostream>#include<cstring>#include<queue>#include<vector>#include<set>#include<map>#include<stack>using namespace std;typedef struct tree{int num,left,right;}tree;tree t[1000];int n;int father[1000]; int cnt=1;int endx=0,start;int find(int x){if(x==father[x]) return x;return father[x]=find(father[x]);}void cengxu(int x){queue<int> que;que.push(x);endx=x;while(que.size()){int num=que.front();que.pop();if(t[num].left!=-1){que.push(t[num].left);endx=t[num].left;cnt++;} else{if(cnt==n) cout<<"YES "<<endx;         else cout<<"NO "<<start;        return; } if(t[num].right!=-1){que.push(t[num].right);endx=t[num].right;cnt++;}else{if(cnt==n) cout<<"YES "<<endx;         else cout<<"NO "<<start;        return; } //if(t[num].left==-1||t[num].right==-1){//} }}int main(){cin>>n;for(int i=0;i<1000;i++) father[i]=i;for(int i=0;i<n;i++){char a[4],b[4]; scanf("%s %s",a,b); if(a[0]!='-'){int sum=0;for(int i=0;i<strlen(a);i++) sum=sum*10+a[i]-'0';father[sum]=i;t[i].left=sum;}else t[i].left=-1;if(b[0]!='-'){int sum=0;for(int i=0;i<strlen(b);i++) sum=sum*10+b[i]-'0';father[sum]=i;t[i].right=sum;}else t[i].right=-1;}start=find(0);cengxu(start);return 0;}



阅读全文
1 0
原创粉丝点击