Description
假如对二叉树T和具有相同高度的满二叉树编号,如果T与满二叉树相同编号的节点位置相同,那么称二叉树T是一棵完全二叉树。现在根据边的连接情况判断一棵树是否是完全二叉树。
Input
输入分两部分:
第一部分:一个整数T,代表测试组数
第二部分:接下来有T组数据,每组的第一行有2个整数n(0 < n < 1024)和r(1<=r<=n), 表示结点数和树根,接下来n-1行每行有2个整数a,b (1 <= a,b <= n)表示a结点和b结点有一条边相连,如果a是b的根结点,则b是a的左子结点,如果b是a的根结点,则a是b的右子结点(数据保证是一棵树而不是一座森林)
Output
对于每组测试,如果对应的是完全二叉树 输出yes 否则输出no
Sample Input
2
5 1
1 2
3 1
4 2
2 5
5 1
1 2
3 1
4 2
3 5
Sample Output
yes
no
顺序存储
#include<stdio.h> int chazhao(int x,int y,int n,int a[],int *p); int panduan(int a[],int n); void Output(int a[],int n); int main() { int T; scanf("%d",&T); while(T--) { int n,g; scanf("%d%d",&n,&g); int a[10000]={0};//初始化 a[1]=g;// 根节点进入数组 int x,y; int p=0,max=1;//max代表数组最大长度 for(int i=1;i<n;i++) { scanf("%d%d",&x,&y); a[i]; int flag=chazhao(x,y,max,a,&p);//查找x,y中那个为根 指针带回根的位置 if(flag)//返回1 代表x 是根 { a[p*2]=y; if(p*2>max)//更新最大长度 { max=p*2; } } else { a[p*2+1]=x; if(p*2+1>max)//更新最大长度 { max=p*2+1; } } } //Output(a,max); int o=panduan(a,max);//判断从a[1]到a[max]是否全为0 if(o==0) printf("no\n"); if(o==1) printf("yes\n"); } } int chazhao(int x,int y,int n,int a[],int *p) { for(int i=1;i<=n;i++) { if(a[i]==x) { *p=i; return 1; } if(a[i]==y) { *p=i; return 0; } } } int panduan(int a[],int n) { for(int i=1;i<=n;i++) { if(a[i]==0) return 0; } return 1; } void Output(int a[],int n) { for(int i=1;i<=n;i++) { printf("%d",a[i]); } printf("\n"); }