本人大四即将结束,于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那么高。所以不用担心,遇到特殊的有规律的数据,我们随机处理就好了。