二叉排序树(搜索树)查找、增加、删除快速入门


前言

二叉排序树也叫二叉搜索树、二叉查找树,是二叉树的一种,但是二叉树的入门很简单,即使没有二叉树的基本,自己手写一个二叉排序树也可以做到,下面我们详细介绍以下二叉排序树的定义和三种最基本的操作——增、删、查。

在这里我们只谈思路、就不附上代码了。

一、定义

满是学究气息的文字定义我们先不看,还是沿用看图说话的惯例。
在这里插入图片描述
数无形时少直觉,形少数时难入微”,所以文字上的定义也是不能少的,其实我们通过上图可以自己总结出来。

对于二叉树上的任意节点,若它的左子树不为空,那么左子树上所有节点的值均小于它的值,若它的右子树不为空,那么右子树上所有节点的值均大于它的值。

目的:构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找、增加和删除数据的速度。因为在一个有序的集合中查找数据的速度总是快于在无序集合中,而且二叉树排序树这种非线性的结构也有利于增加和删除节点(类似链表)。

二、查找

图一:初始状态,若查找80。
在这里插入图片描述
图二:先遍历根节点,与80比大小,若大约根节点的数值(60),则向右移;否则向左移。
在这里插入图片描述
图三:同理与75比较大小,若大于75则向右移;否则向左移。
在这里插入图片描述
图四:这样我们就找了数值是80的这个节点。
在这里插入图片描述

三、增加节点

增加节点的操作是以查找操作为基础的,分为两步。

第一步:找到自己的父节点;

第二步:与父节点比大小,决定成为该父节点的左子还是右子。

我们还以刚才的图为例。
图一:初始状态,若插入值为90的节点。
在这里插入图片描述
图二:先遍历根节点,与90比大小,若大约根节点的数值(60),则向右移;否则向左移。
在这里插入图片描述
图三:同理与75比较大小,若大于75则向右移;否则向左移。
在这里插入图片描述
图四:到这里发现80已经没有子节点了,那么就选定他成为父节点。
在这里插入图片描述
图五:与父节点比大小。大于父节点,成为父节点的右子。
在这里插入图片描述

四、删除节点

“请佛容易送佛难”,要删除节点的话就没那么轻松了,因为要考虑到删除该节点后整个二叉树还满住二叉排序树的要求。一共有三种情况。

1.单身狗

即如下图中的深色节点,这个要删除的节点是一个可怜的单身狗。。。
在这里插入图片描述
那么就把它直接删除!我们可以看到直接删除后对整个二叉树排序树并没有什么影响。

2.独生子

这个节点的后代虽然只有一棵独苗,但也是有的。
在这里插入图片描述
当他驾崩后,这皇位要传给谁呢?当然是他的独生子69。而且我们把69放到62的位置发现二叉排序树的性质并没有被破坏,如下图。
在这里插入图片描述
当然,若这颗独苗也有后代,情况是一样的。
在这里插入图片描述

3.多子多孙

“哈哈哈哈!我可是多福多寿,多子多孙之人!”又来了一个节点。这个节点可是儿孙满堂,那么他驾崩后,“夺嫡”自然是不可避免的。
在这里插入图片描述
30他驾崩了,留下了大好河山,宗室诸王们蠢蠢欲动,谁都想过一把皇帝瘾,经过一番比拼,发现25或者35都可以继承皇位,那就二者选其一吧。

“等等!怎么就25或者35了?”一个外国人不明所以地问道。原来在二叉排序树内部皇位的继承不是看谁最强而是看谁最像的。在30的众多子孙中只有25和35是最像他的(和他的差距最小)。

但是在实际操作中我们不一定要真的把30删掉,可以稍稍变通一下,先找到继承人将他的值赋给要删除的节点,再将继承人删除。

看到这里有些人不禁会想这个方法听上去简单,实际中要怎么用算法找到继承人呢?之后会与大家分享两句口诀,保证让大家按图索骥,顺利找到这两个节点。

(1)25继承

在这里插入图片描述

口诀一:左转,向右到尽头。

我们再来看一个例子,如下图:
在这里插入图片描述
注意:对于继承人来说他只有单身狗和左独生子这两种情况,不存在右独生子和多子多孙的情况,不明的话,再看看口诀就明白了,如果他存在右子,那么皇位还能轮到他继承吗?口诀可是向右到尽头!

(2)35继承

在这里插入图片描述

口诀二:右转,向左到尽头。

同样我们再来看一个例子,如下图:
在这里插入图片描述
注意:同理,对于第二种情况的继承人来说他只有单身狗和右独生子这两种情况,不存在左独生子和多子多孙的情况,如果他存在左子,就不是他继承皇位了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉搜索二叉排序树结构中的两种形式,它们在实现和使用上有一些区别。下面是它们的区别: 1. 定义: - 二叉搜索:二叉搜索是一种特殊的二叉,其中每个节点的值大于其左子中的所有节点的值,小于其右子中的所有节点的值。 - 二叉排序树二叉排序树也是一种特殊的二叉,其中每个节点的值大于其左子中的所有节点的值,小于其右子中的所有节点的值,并且左子和右子也都是二叉排序树。 2. 插入操作: - 二叉搜索:在二叉搜索中插入一个新节点时,需要按照节点值的大小关系找到合适的位置插入,保持二叉搜索的性质。 - 二叉排序树:在二叉排序树中插入一个新节点时,同样需要按照节点值的大小关系找到合适的位置插入,保持二叉排序树的性质。 3. 删除操作: - 二叉搜索:在二叉搜索删除一个节点时,需要考虑节点的子节点情况,并进行相应的调整,以保持二叉搜索的性质。 - 二叉排序树:在二叉排序树删除一个节点时,同样需要考虑节点的子节点情况,并进行相应的调整,以保持二叉排序树的性质。 4. 平衡性: - 二叉搜索:二叉搜索的平衡性取决于节点的插入和删除操作,如果操作不当,可能导致二叉搜索不平衡,进而影响搜索的效率。 - 二叉排序树二叉排序树通常是平衡的,即左子和右子的高度差不超过1,这样可以保证搜索的效率。 综上所述,二叉搜索二叉排序树在定义、插入操作、删除操作和平衡性上存在一些区别。二叉搜索是一种特殊的二叉,而二叉排序树是一种特殊的二叉搜索,它们都具有按照节点值的大小关系进行插入和删除操作的特点,但二叉排序树通常是平衡的,而二叉搜索可能不平衡。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值