“学习笔记”之《算法导论》----第三部分----数据结构----第十二章----二叉搜索树

本人大四即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接

放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以解释数学公式为主。

搜索树数据结构支持很多操作,包括:寻找,找最小,找最大,插入,删除等等。对于有n个结点的一棵树,这些操作的最坏运行时间为θ(lgn),先不管怎么推算出来的(其实很简单,但是公式有点多),知道它就行了。

这一章的每个功能的代码给的很详细,有兴趣的可以看看原文中的伪代码。

 什么是二叉搜索树

我把我的第六章博客里面的图拿出来。

                                                      

这是一个树上的小结,表达什么意思呢?绿色的是父母,两个蓝色的一个叫左孩子,一个叫右孩子

重要性质:左孩子必须小于等于它的父母,右孩子必须大于等于它的父母。

每个元素(每个结点)有四个属性:指向父母的指针(根节点没有),指向左孩子的指针,指向右孩子的指针,自己本身的关键字。

查找二叉搜索树

在这里我的声明一下,我觉得这章的排版有问题,应该是先讲二叉搜索树的插入,然后再讲它的查找功能,要不然直接看查找非常容易陷入在一个小细节中!!!而且看我这个文章的朋友,建议先看下面的插入,再回头来看查找。

这个就很简单啦,根据树的重要性质,我们从根节点开始找,我们要找的数比当前结点小就跳到左孩子找,反之我们跳到右孩子找,直到找到为止。

最小的关键字查找方法:沿着root结点,一直往左找。

最大的关键字查找方法:沿着root结点,一直往右找。

后继:他是个特定的元素。对于某个结点来说,它的后继元素是,大于它的最小关键字的结点。后继这个东西,一会儿将插入算法会用到。

插入和删除 

插入:从根结点开始向下走,直到找到合适的位置为止(假设所有元素互异),怎么往下找呢?还是根据那个重要的性质:左孩子必须小于等于它的父母,右孩子必须大于等于它的父母。

删除:啊!!!这个是最复杂的。代码我就不放了,这个删除的功能分四种情况。

(1)要删除的结点没有左孩子,直接把右孩子代替它父母就行了r->z。

(2)要删除的结点没有右孩子,直接把左孩子代替它父母就行了l->z

 (3)要删除的结点有两个孩子,而且它的后继元素正好是它的右孩子,那么就像这样,直接拼过去,注意,它的后继元素肯定没有左孩子。

(4)要删除的结点有两个孩子,而且它的后继元素不是它的右孩子,像这样,后继元素先和右孩子调换,然后,y再替换z,最后,z的左孩子再拼接到y的左边。(这段代码有点难度,在第八行:y.right = z.right,理解这个就妥了)

随机构建的二叉搜索树

这部分说的是,我们构建,也就是最开始往树里插入数据的时候,如果是这个样子的顺序,1,2,3,4,5,6,7,8.....n。那就完了。这就跟普通的数组没啥区别了。但是本节分析了,如果是随机插入的话,平均高度是lgn那么高。所以不用担心,遇到特殊的有规律的数据,我们随机处理就好了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Naruto

你的鼓励是我的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值