《我的第一本算法书》阅读笔记 1-8 二叉查找树

目录

二叉查找树性质

插入数据——插入1

插入数据——插入4

删除节点——节点无子结点的情况

删除节点——有一个字节点的情况

删除节点——节点有子树的情况

查找结点

解说

补充说明

来源


二叉查找树(又叫作二叉搜索树或二叉排序树)是一种数据结构,采用了图的树形结构 (关于树形结构的详细说明请参考 4-2 节)。数据存储于二叉查找树的各个结点中。


二叉查找树性质

这就是二叉查找树的示例。结点中的数字便是存储的数据。此处以不存在相同数字为前提进行说明。

二叉查找树有两个性质。第一个是每个结点的值均大于其左子树上任意一个结点的值。比如 结点9大于其左子树上的3和8。

同样,结点15也大于其左子树上任意一个结点的值。

第二个是每个结点的值均小于其右子树上任意一个结点的值。比如结点 15 小于其右子树上的 23、17和28。

根据这两个性质可以得到以下结论。首先,二 叉查找树的最小结点要从顶端开始,往其左下的末端寻找。此处最小值为3。

反过来,二叉查找树的最大结点要从顶端开 始,往其右下的末端寻找。此处最大值为28。

插入数据——插入1

下面我们来试着往二叉查找树中添加数据。比如添加数字1。

首先,从二叉查找树的 顶端结点开始寻找添加 数字的位置。将想要添 加的1与该结点中的值 进行比较,小于它则往左移,大于它则往右移

由于1<9,所以将1往左移.

由于1<3,所以继续将1往左移,但前面已经没有结点了,所以把 1 作为新结点添加到左下方。

这样,1的添加操作便完成了.


插入数据——插入4

接下来,我们再试试添加数字4。

和前面的步骤一样, 首先从二叉查找树 的顶端结点开始寻找添加数字的位置。

由于4<9,所以将其往左移.

由于4>3,所以将其往右移。

由于4<8,所以需要将其往左移,但前面已经没 有结点了,所以把 4 作为新结点添加到左下方。

于是4的添加操作也完成了


删除节点——节点无子结点的情况

接下来看看如何在二叉查找树中删除结点。比如我们来试试删除结点28

如果需要删除的结点没有子结点,直接删掉该结点即可。


删除节点——有一个字节点的情况

再试试删除结点8。

如果需要删除的结点只有一个子结点,那么先 删掉目标结点……

然后把子结点移到被删除结点的位置上即可。


删除节点——节点有子树的情况

最后来试试删除结点9

如果需要删除的结点有两个子结点,那么先删 掉目标结点……

然后在被删除结点的左子树中寻找最大结点……

(Tips :  删除9的时候,我们将“左子树中的最大结点”移动到了删除结点的位置上,但是根据二叉查找树的性质可知,移动“右子树中的最小结点”也没有问题。)

最后将最大结点移到被删除结点的位置上。这样一来,就能在满足二叉查找树性质的前提下删除结点了。 如果需要移动的结点(此处为4)还有子结点,就递归执行前面的操作(关于递归,请参照7-4节的内容)。


查找结点

下面来看看如何在二叉查找树中查找结点。比 如我们来试试查找12。

从二叉查找树的顶端结点开始往下查找。和添 加数据时一样,把12和结点中的值进行比较, 小于该结点的值则往左移,大于则往右移。

由于12>4,所以往右移。

找到结点12了。

解说

我们可以把二叉查找树当作是二分查找算法思想的树形结构体现(二分查找的详细 说明在 3-2 节)。因为它具有前面提到的那两个性质,所以在查找数据或寻找适合添加 数据的位置时,只要将其和现有的数据比较大小,就可以根据比较结果得知该往哪边移 动了。

比较的次数取决于树的高度。所以如果结点数为 n,而且树的形状又较为均衡的话, 比较大小和移动的次数最多就是 log2n。因此,时间复杂度为 O(logn)。但是,如果树的 形状朝单侧纵向延伸,树就会变得很高,此时时间复杂度也就变成了 O(n)。

补充说明

有很多以二叉查找树为基础扩展的数据结构,比如“平衡二叉查找树”。这种数据 结构可以修正形状不均衡的树,让其始终保持均衡形态,以提高查找效率。

另外,虽然文中介绍的二叉查找树中一个结点最多有两个子结点,但我们可以把子结点数扩展为 m(m 为预先设定好的常数)。像这种子结点数可以自由设定并且形状均衡的树便是 B 树

来源

《我的第一本算法书》  [日]石田保辉 宫崎修一/著    张贝/译

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值