7-4 是否同一棵二叉搜索树 (25 分)

7-4 是否同一棵二叉搜索树 (25 分)

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数$N (\leq 10)$和$L$,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出$N$个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出$N$个插入的元素,属于$L$个需要检查的序列。

简单起见,我们保证每个插入序列都是1到$N$的一个排列。当读到$N$为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

1
2
3
4
5
6
7
8
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

输出样例:

1
2
3
Yes
No
No

鸣谢青岛大学周强老师补充测试数据!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include <stdio.h>
#include <stdlib.h>


typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */

typedef struct TreeNode *Tree;
struct TreeNode
{
ElemType data;
Tree left,right;
int flag; //被访问过为1 否则0
};

Tree NewNode(ElemType data);
Tree Insert(Tree T,ElemType data);
Tree MakeTree(int N);
int check (Tree T,ElemType data);
int Judge(Tree T,int N);
void ResetT(Tree T);
void FreeTree(Tree T);

int main()
{
int N,L;
Tree T;
int i;

scanf("%d",&N);

while( N )
{
scanf("%d",&L);
T = MakeTree( N );
for( i=0; i<L; i++)
{
if( Judge(T,N))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
ResetT( T ); //清除flag标记
}
FreeTree( T );
scanf("%d",&N);
}

return 0;
}


Tree NewNode(ElemType data)
{
//创建一个新的结点
Tree T = (Tree) malloc(sizeof(struct TreeNode));
T->data = data;
T->flag = 0;
T->left = T->right =NULL;
return T;
}


Tree Insert(Tree T,ElemType data)
{
//插入一个新的结点

if( !T ){
T = NewNode(data);
}
else{
if( data > T->data)
{
T->right = Insert( T->right,data);
}
else if( data < T->data )
{
T->left = Insert( T->left,data);
}

//相等则不插入
}

return T;
}
Tree MakeTree(int N)
{
Tree T;
ElemType data;
int i;

scanf("%d",&data);
T = NewNode( data );
for( i=1; i<N; i++)
{
scanf("%d",&data);
T = Insert( T,data);
}
return T;
}
int check (Tree T,ElemType data)
{
if( T->flag )
{
if( data < T->data)
{
return check( T->left,data );
}
else if( data > T->data)
{
return check( T->right,data);
}
}
else
{
if( data == T->data)
{
T->flag = 1;
return 1;
}
else return 0;
}
}

int Judge(Tree T,int N)
{
//检验需验证的树是否跟已经构建的树一致
ElemType data;
int flag = 0;
int i ;
scanf("%d",&data);
if( data != T->data)
{
flag = 1; //根节点不一致
}
else
{
T->flag = 1;
}

for( i=1; i<N; i++)
{
scanf("%d",&data);
if( (!flag) && (!check(T,data)))
{
flag = 1;
}
}
if(flag) return 0;
else return 1;
}

void ResetT(Tree T)
{
if(T->left)
{
ResetT(T->left);
}
if(T->right)
{
ResetT(T->right);
}
T->flag = 0;
}

void FreeTree(Tree T)
{
if(T->left)
{
FreeTree(T->left);
}
if(T->right)
{
FreeTree(T->right);
}
free(T);
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×