7-4 是否同一棵二叉搜索树(25 分)
给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出样例:
Yes No No
建一颗树,判别其他序列是否与其一致
一开始是想要建两棵树用来互相比较的,但是试了很多次都没能拿满分
下面是几乎全仿浙江大学慕课数据结构课程的做法,代码稍微有点长
其核心思想是:只
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */ 6 7 typedef struct TreeNode *Tree; 8 struct TreeNode 9 { 10 ElemType data; 11 Tree left,right; 12 int flag; //被访问过为1 否则0 13 }; 14 15 Tree NewNode(ElemType data); 16 Tree Insert(Tree T,ElemType data); 17 Tree MakeTree(int N); 18 int check (Tree T,ElemType data); 19 int Judge(Tree T,int N); 20 void ResetT(Tree T); 21 void FreeTree(Tree T); 22 23 int main() 24 { 25 int N,L; 26 Tree T; 27 int i; 28 29 scanf("%d",&N); 30 31 while( N ) 32 { 33 scanf("%d",&L); 34 T = MakeTree( N ); 35 for( i=0; i<L; i++) 36 { 37 if( Judge(T,N)) 38 { 39 printf("Yes\n"); 40 } 41 else 42 { 43 printf("No\n"); 44 } 45 ResetT( T ); //清除flag标记 46 } 47 FreeTree( T ); 48 scanf("%d",&N); 49 } 50 51 return 0; 52 } 53 54 55 Tree NewNode(ElemType data) 56 { 57 //创建一个新的结点 58 Tree T = (Tree) malloc(sizeof(struct TreeNode)); 59 T->data = data; 60 T->flag = 0; 61 T->left = T->right =NULL; 62 return T; 63 } 64 65 66 Tree Insert(Tree T,ElemType data) 67 { 68 //插入一个新的结点 69 70 if( !T ){ 71 T = NewNode(data); 72 } 73 else{ 74 if( data > T->data) 75 { 76 T->right = Insert( T->right,data); 77 } 78 else if( data < T->data ) 79 { 80 T->left = Insert( T->left,data); 81 } 82 83 //相等则不插入 84 } 85 86 return T; 87 } 88 Tree MakeTree(int N) 89 { 90 Tree T; 91 ElemType data; 92 int i; 93 94 scanf("%d",&data); 95 T = NewNode( data ); 96 for( i=1; i<N; i++) 97 { 98 scanf("%d",&data); 99 T = Insert( T,data); 100 } 101 return T; 102 } 103 int check (Tree T,ElemType data) 104 { 105 if( T->flag ) 106 { 107 if( data < T->data) 108 { 109 return check( T->left,data ); 110 } 111 else if( data > T->data) 112 { 113 return check( T->right,data); 114 } 115 } 116 else 117 { 118 if( data == T->data) 119 { 120 T->flag = 1; 121 return 1; 122 } 123 else return 0; 124 } 125 } 126 127 int Judge(Tree T,int N) 128 { 129 //检验需验证的树是否跟已经构建的树一致 130 ElemType data; 131 int flag = 0; 132 int i ; 133 scanf("%d",&data); 134 if( data != T->data) 135 { 136 flag = 1; //根节点不一致 137 } 138 else 139 { 140 T->flag = 1; 141 } 142 143 for( i=1; i<N; i++) 144 { 145 scanf("%d",&data); 146 if( (!flag) && (!check(T,data))) 147 { 148 flag = 1; 149 } 150 } 151 if(flag) return 0; 152 else return 1; 153 } 154 155 void ResetT(Tree T) 156 { 157 if(T->left) 158 { 159 ResetT(T->left); 160 } 161 if(T->right) 162 { 163 ResetT(T->right); 164 } 165 T->flag = 0; 166 } 167 168 void FreeTree(Tree T) 169 { 170 if(T->left) 171 { 172 FreeTree(T->left); 173 } 174 if(T->right) 175 { 176 FreeTree(T->right); 177 } 178 free(T); 179 }
在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!