题意理解
![](https://img-blog.csdnimg.cn/d872badc22934658a77fe0a212985f67.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/5f28c830b9cf4caf8cb66d4e13337e28.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/e8f1c2b9e7194efd9d99ef987ff5bf97.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
求解思路
![](https://img-blog.csdnimg.cn/9d00be5c4c7848258fd7ce9d607ee2d7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
采用上面的第三种实现方法去求解:
![](https://img-blog.csdnimg.cn/4b3fba12f96942b9b4131bff4a6f77ae.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/cf7ca726c19f468daed8147c481fe12c.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
搜索树表示
typedef struct TreeNode *Tree;
struct TreeNode {
int v;
Tree Left, Right;
int flag;
};
Left、Right使用链表的形式来表示我们的树。
用v来表示这个结点的基本信息。
flag阈用来判别一个序列是不是跟树一致的。falg的实际含义就是他将来如果某个节点没被访问过flag设为0,被访问过flag设为1,所以flag是作为有没被访问过的一个标记。 帮助我们来判断一个序列是不是跟T是一致的。
程序框架搭建:
![](https://img-blog.csdnimg.cn/cd54cac5c0a24910ae379a77a54c0134.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
int main()
{ int N, L, i;
Tree T;
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); /*清除T中的标记flag*/
}
FreeTree(T);//释放树
scanf("%d", &N);//读入下一个树的结点的个数
}
return 0;
}
如何建搜索树?
![](https://img-blog.csdnimg.cn/7f91d6e42563420d8e004ce150048eca.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
Tree MakeTree( int N )
{
Tree T;
int i, V;
scanf("%d", &V);//读入序列的第一个结点(根)
T = NewNode(V);//创建二叉搜索树的根结点
for (i=1; i<N; i++) {
scanf("%d", &V);//循环读入序列剩下的所有结点
T = Insert(T, V);//读入一个结点后就插入到二叉搜索树中
}
return T;//将创建好的树返回
}
Tree NewNode( int V )
{
Tree T = (Tree)malloc(sizeof(struct TreeNode));//开辟空间
T->v = V;//数据赋值
T->Left = T->Right = NULL;//一开始左右孩子结点为空
T->flag = 0;//flag用来判断结点是否被访问过
return T;
}
Tree Insert( Tree T, int V )
{
if ( !T ) T = NewNode(V);//搜索树为空就开辟结点(根)
else {//进行插入的过程
if ( V>T->v )
T->Right = Insert( T->Right, V );
else
T->Left = Insert( T->Left, V );
}
return T;//返回树
}
如何判别两个序列的搜索树是一致的?
![](https://img-blog.csdnimg.cn/a62869dd53d94866a989caf812450e1a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/dfd9181b546543de82a8de371fd2cccd.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/39aa985b9fd24f2a9b865077d3f3890f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
注意:
上面的是有bug版本的,因为当我们输入的序列中的某个数与T不一致的时候,我们就直接退出来了,但是我们不知道退出来了,所以我们会继续输入序列中与T不一致的数的后面的数,但是我们已经退出来了,此时输入的数应该是下一个搜索树的判定,那么我们输入的和我们程序需要的不一致,就出错了。
所以,就算当我们输入的序列中的某个数与T不一致的时候,我们也要把序列中剩下的数读完再去进行下一个搜索树的判定。
![](https://img-blog.csdnimg.cn/64c3c58433324bd3a26e14e7d263a01e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFF00,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/c28a0e494b8542089b566a313ef6f23a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/6082747ad0354d72bf08a3ada081b467.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5oyg5aS05bCP6Lev6aOe,size_20,color_FFFFFF,t_70,g_se,x_16)