如何判别是否同一棵二叉搜索树?

对于一个确定的线性序列,按顺序插入序列可以确定一棵唯一的二叉搜索树,但是。一棵二叉搜索树却可以有多种插入序列得到。例如序列1{592} 和序列2{529}两个序列插入初始为空的二叉搜索树中,得到的两棵二叉搜索树是一样的。所以,如何判断两棵或多棵二叉搜索树是否相同?

第一种方法很自然的我们就想到是两棵树做遍历,比较每一个结点,也就是用递归,一开始看根结点同不同,然后递归比较左子树同不同,右子树同不同,这样的方法代码和遍历相似

判别是否同一棵二叉搜索树,我们还有其他方法,我们想象,之前讲二叉树的遍历时,我们说二叉树是二维的结构,而我们对二叉树的遍历是把二叉树变成一维的线性的序列结构。从这里我们可以得到启示,对二叉搜索树的比较判别,前面说到按顺序插入序列可以确定一棵唯一的二叉搜索树,但一棵二叉搜索树却可以有多种插入序列得到。所以我们可以建立一棵树作为基础,然后通过其他要做比较的树的插入序列来判别两棵树是否一致。

这句话是什么意思,假设我们根据插入序列1{5364}构造了一棵二叉搜索树,插入序列2{5463},按照这两种插入序列插入空树形成的二叉搜索树,如何判别是否一致?

我们的方法是,把序列1建立成一棵二叉搜索树,然后在树中按顺序遍历搜索序列2中的每一个数,如果每次搜索时,经过的结点都被搜索过,那就是一样的两棵搜索树;否则,如果某次搜索时,经过有前面没被搜索过的结点,那这两棵树就不一样。这个方法的意思是:

例如序列1构造的树BT,序列2中的序列我们按顺序一个一个的在BT里搜索。一开始搜索55是根结点,找到了,接下来到4,查找4时会经过左结点3,这时的3时前面没被搜索过的,所以这样我们就可以判别这两个序列形成的二叉搜索树时不同的。

根据这个方法,我们在构建二叉搜索树的结构时就要加一个标记,flag=0;用作后面判别时,判断这个结点有没有被搜索过,flag一开始定义为0,表示没搜索过,被搜索过后的结点的flag就令它等于1

然后是判别的代码:

函数的两个参数一个是树BT,根据一个序列建立的二叉搜索树。另一个参数X为要判别是否一致的另一个插入序列。然后看程序,第75行判断结点的flag,如果被搜索过,也就是flag==1,就会做递归遍历搜索,否则如果遇到flag==0,也就是遇到没被搜索过的结点,这时就要做判断了。第83行开始,判断这个没被搜索过的结点的DataX是否相等,如果相等,就是说这个结点就是我要搜索的结点,就把它的Data设为1。如果该结点的DataX不相等,也就是说在搜索过程中,没找到要搜索的元素时,就碰到了前面没被搜索过的结点,那么就可以判断这个插入序列和树BT是不相等的了。这个判别函数的结构就是一个查找的结构。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值