团体程序设计天梯赛 L3-016. 二叉搜索树的结构
1 #include <cstdio> 2 #include <cstdlib> 3 #include <string.h> 4 #include <math.h> 5 #include <stdbool.h> 6 #include <algorithm> 7 using namespace std; 8 #define maxn 500+100 9 10 //离散化+结构体数组存储树(数据可能很大,不可能用tree[x]记录值为x的结点,而用链表存储树,在这一题判断兄弟结点等不太方便) 11 //输入的数据点也许并不在树上 12 //兄弟结点不能相同 13 14 struct node 15 { 16 long left,right,fa,depth; 17 }tree[maxn]; 18 19 long n,num[maxn],z[maxn]; 20 21 bool cmp(long a,long b) 22 { 23 return a<b; 24 } 25 26 //better:binary search 27 int findnum(long value) 28 { 29 long i; 30 for (i=1;i<=n;i++) 31 if (value==z[i]) 32 return i; 33 return n+1; 34 } 35 36 int add(long pos,long value,long depth) 37 { 38 if (value < pos) 39 { 40 if (tree[pos].left==0) 41 { 42 tree[pos].left=value; 43 tree[value].fa=pos; 44 tree[value].depth=depth; 45 } 46 else 47 add(tree[pos].left,value,depth+1); 48 } 49 else 50 { 51 if (tree[pos].right==0) 52 { 53 tree[pos].right=value; 54 tree[value].fa=pos; 55 tree[value].depth=depth; 56 } 57 else 58 add(tree[pos].right,value,depth+1); 59 } 60 } 61 62 int main() 63 { 64 long i,j,x,y,p,q,m,root; 65 char a[20],b[20],c[20],d[20],e[20],f[20]; 66 scanf("%ld",&n); 67 for (i=1;i<=n;i++) 68 { 69 scanf("%ld",&z[i]); 70 num[i]=z[i]; 71 } 72 for (i=1;i<=n;i++) 73 { 74 tree[i].left=0; 75 tree[i].right=0; 76 tree[i].fa=0; //不能像并查集一样设置为i 77 } 78 sort(z+1,z+n+1,cmp); //[x,y) 79 80 root=findnum(num[1]); 81 tree[root].depth=0; 82 for (i=2;i<=n;i++) 83 { 84 j=findnum(num[i]); 85 add(root,j,1); 86 } 87 88 scanf("%ld",&m); 89 while (m) 90 { 91 m--; 92 scanf("%ld",&x); 93 p=findnum(x); 94 scanf("%s",a); 95 if (strcmp(a,"is")==0) 96 { 97 scanf("%s%s",b,c); 98 if (strcmp(c,"root")==0) 99 { 100 // if (p!=n+1 && tree[p].fa==0) 101 if (x==num[1]) 102 printf("Yes\n"); 103 else 104 printf("No\n"); 105 } 106 else if (strcmp(c,"parent")==0) 107 { 108 scanf("%s",d); 109 scanf("%ld",&y); 110 q=findnum(y); 111 if (q!=n+1 && tree[q].fa==p) 112 printf("Yes\n"); 113 else 114 printf("No\n"); 115 } 116 else if (strcmp(c,"left")==0) 117 { 118 scanf("%s%s",d,e); 119 scanf("%ld",&y); 120 q=findnum(y); 121 if (q!=n+1 && tree[q].left==p) 122 printf("Yes\n"); 123 else 124 printf("No\n"); 125 } 126 else 127 { 128 scanf("%s%s",d,e); 129 scanf("%ld",&y); 130 q=findnum(y); 131 if (q!=n+1 && tree[q].right==p) 132 printf("Yes\n"); 133 else 134 printf("No\n"); 135 } 136 } 137 //and 138 else 139 { 140 scanf("%ld",&y); 141 q=findnum(y); 142 scanf("%s%s",b,c); 143 if (strcmp(c,"siblings")==0) 144 { 145 if (p!=n+1 && q!=n+1 && p!=q && tree[p].fa==tree[q].fa) //两个结点不能相同 146 printf("Yes\n"); 147 else 148 printf("No\n"); 149 } 150 else 151 { 152 scanf("%s%s%s",d,e,f); 153 if (p!=n+1 && q!=n+1 && tree[p].depth==tree[q].depth) 154 printf("Yes\n"); 155 else 156 printf("No\n"); 157 } 158 } 159 } 160 return 0; 161 }