09:43:33 2019-08-27
努力
对于非空二叉树 ${n_0}$是表示叶节点的个数
${n_0}+{n_1}+{n_2}-{1}=0*{n_0}+1*{n_1}+2*{n_2}$
即可得出
${n_0}={n_2}+{1}$
二叉树的遍历方法
PTA 第6题 判断2个树是否同构
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 struct TreeNode 5 { 6 char Data; 7 int LChild; 8 int RChild; 9 }Tree1[10],Tree2[10]; 10 11 int Change(const char num) //将读入的字符修改后返回 12 { 13 if (num != '-') 14 return num - '0'; 15 else 16 return -1; 17 } 18 int Charge(int T1,int T2) //判别2个树是否重构 19 { 20 if (T1 == -1 && T2 == -1) //都为空树 为同构 21 return 1; 22 if ((T1 == -1 && T2 != -1) || (T1 != -1 && T2 == -1)) //一空 一不空 不同构 23 return 0; 24 if (Tree1[T1].Data != Tree2[T2].Data) //节点的值不一样 不同构 25 return 0; 26 if (Tree1[T1].LChild == -1 && Tree2[T2].LChild == -1) //无左子树 27 return Charge(Tree1[T1].RChild, Tree2[T2].RChild); 28 if ((Tree1[T1].LChild != -1 && Tree2[T2].LChild != -1) && Tree1[Tree1[T1].LChild].Data == Tree2[Tree2[T2].LChild].Data) 29 return (Charge(Tree1[T1].LChild, Tree2[T2].LChild) && Charge(Tree1[T1].RChild, Tree2[T2].RChild)); 30 else 31 return (Charge(Tree1[T1].LChild, Tree2[T2].RChild) && Charge(Tree1[T1].RChild, Tree2[T2].LChild)); 32 } 33 int BulidTree(struct TreeNode Tree[]) 34 { 35 int N; 36 int Root=0; 37 int Check[10] = { 0 }; //用数组来记录哪个值未出现 38 scanf("%d", &N); 39 if (!N) 40 { 41 Root = -1; 42 } 43 char c, num1, num2; 44 for (int i = 0; i < N; i++) 45 { 46 getchar(); 47 scanf("%c %c %c", &c, &num1, &num2); 48 Tree[i].Data = c; 49 Tree[i].LChild = Change(num1); //对字符进行改变 并返回整数 50 if (Tree[i].LChild != -1) Check[Tree[i].LChild] = 1; 51 Tree[i].RChild = Change(num2); 52 if (Tree[i].RChild != -1) Check[Tree[i].RChild] = 1; 53 } 54 for (int i = 0; i < N; i++) 55 if (!Check[i]) 56 { 57 Root = i; 58 break; 59 } 60 return Root; 61 } 62 int main() 63 { 64 int TreeA, TreeB; 65 TreeA = BulidTree(Tree1); 66 TreeB = BulidTree(Tree2); 67 if (Charge(TreeA,TreeB)) 68 printf("Yes"); 69 else 70 printf("No"); 71 }