Skip to content

Commit b7fbc64

Browse files
committed
【添加】:是否是同一棵二叉搜索树的判别题目代码
1 parent f943bc7 commit b7fbc64

File tree

2 files changed

+141
-1
lines changed

2 files changed

+141
-1
lines changed

Lectures/Lecture-8.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,6 @@
3030

3131
## 二叉搜索树的插入
3232

33-
## 二叉搜索树的删除
33+
## 二叉搜索树的删除
34+
35+
- 是否是同一棵二叉搜索树,两个序列是否对应相同搜索树的判别

eclipse/DataStructuresCode/src/04_4_IsSameBinarySearchTree.cpp

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,144 @@ No
3232
No
3333
*/
3434

35+
//解本题用到的方法是先建立一棵树,然后依照这个树分别判别后面的L个序列能否与T形成同一个搜索树并输出结果
36+
#include <stdio.h>
37+
#include <stdlib.h>
38+
39+
typedef struct treenode *tree;
40+
struct treenode {
41+
int v;
42+
tree left, right;
43+
int flag;
44+
};
45+
46+
//创建一个新的结点
47+
tree new_node(int v) {
48+
tree t = (tree) malloc(sizeof(struct treenode));
49+
t->v = v;
50+
t->left = t->right = NULL;
51+
t->flag = 0;
52+
return t;
53+
}
54+
55+
//向节点插入数据
56+
tree insert_tree(tree t, int v) {
57+
if (!t)
58+
t = new_node(v); //如果是一棵空树,那么创建一个新节点作为树根
59+
else {
60+
if (v > t->v) {
61+
t->right = insert_tree(t->right, v);
62+
} else {
63+
t->left = insert_tree(t->left, v);
64+
}
65+
}
66+
return t;
67+
}
68+
69+
//创建一棵搜索树
70+
tree make_tree(int n) {
71+
tree t;
72+
int i, v;
73+
74+
scanf("%d", &v);
75+
76+
t = new_node(v);
77+
for (i = 1; i < n; i++) {
78+
scanf("%d", &v);
79+
t = insert_tree(t, v);
80+
}
81+
return t;
82+
}
83+
84+
//在树t中搜索整数v,看看v是否符合要求
85+
int check(tree t, int v) {
86+
if (t->flag) {
87+
if (v < t->v)
88+
return check(t->left, v);
89+
else if (v > t->v)
90+
return check(t->right, v);
91+
} else {
92+
if (v == t->v) {
93+
t->flag = 1;
94+
return 1;
95+
} else {
96+
return 0;
97+
}
98+
99+
}
100+
}
101+
102+
//判断一组数据插入后是否和树t相同,返回1则相同,返回0则不相同
103+
//判断flag的原因是,即使已经知道不一致了,但是如果不继续将后面的数据输入,会导致程序错误
104+
int judge(tree t, int n) {
105+
int i, v, flag = 0;
106+
scanf("%d", &v);
107+
if (v != t->v) //如果树根不相等,直接返回0,即不同
108+
flag = 1;
109+
else
110+
t->flag = 1; //这个节点比较过
111+
112+
for (i = 1; i < n; i++) {
113+
scanf("%d", &v);
114+
if ((!flag) && !check(t, v))
115+
flag = 1;
116+
}
117+
118+
if (flag)
119+
return 0;
120+
else
121+
return 1;
122+
}
123+
124+
void reset_tree(tree t) {
125+
if (t->left)
126+
reset_tree(t->left);
127+
if (t->right)
128+
reset_tree(t->right);
129+
t->flag = 0;
130+
}
131+
132+
void free_tree(tree t) {
133+
if (t->left)
134+
free_tree(t->left);
135+
if (t->right)
136+
free_tree(t->right);
137+
free(t);
138+
}
139+
140+
/*
141+
读入 n 和 l
142+
根据第一行序列建立树T
143+
依据树T分别判断后面的L个序列是否能与T形成同一搜索树并输出结果
144+
如何判别序列是否与树是一致的呢?
145+
方法:在树T中按顺序搜索序列中的每个数
146+
- 如果每次搜索所经过的节点在前面均为出现过,则一致
147+
- 否则,如果某次搜索中遇到前面未出现的节点,则不一致
148+
*/
149+
int main() {
150+
int n, l, i;
151+
tree t;
152+
153+
scanf("%d", &n); //输入后面每个序列的节点数
154+
155+
while (n) {
156+
scanf("%d", &l); //获得后面有几组数据,然后分别判定每一组数据
157+
t = make_tree(n);
158+
for (i = 0; i < l; i++) {
159+
if (judge(t, n)) {
160+
printf("Yes\n");
161+
} else {
162+
printf("No\n");
163+
}
164+
reset_tree(t);
165+
}
166+
free_tree(t);
167+
scanf("%d", &n); //读入下一个N也就是下一组数据的节点个数,开启下一个循环
168+
}
169+
170+
return 0;
171+
}
172+
35173

36174

37175

0 commit comments

Comments
 (0)