算法系列15天速成——第六天 五大经典查找【下】

系统 1712 0

大家是否感觉到,树在数据结构中大行其道,什么领域都要沾一沾,碰一碰。

就拿我们前几天学过的排序就用到了堆和今天讲的”二叉排序树“,所以偏激的说,掌握的树你就是牛人了。

今天就聊聊这个”五大经典查找“中的最后一个”二叉排序树“。

1. 概念:

<1> 其实很简单,若根节点有左子树,则左子树的所有节点都比根节点小。

若根节点有右子树,则右子树的所有节点都比根节点大。

<2> 如图就是一个”二叉排序树“,然后对照概念一比较比较。

算法系列15天速成——第六天 五大经典查找【下】

2.实际操作:

我们都知道,对一个东西进行操作,无非就是增删查改,接下来我们就聊聊其中的基本操作。

<1> 插入:相信大家对“排序树”的概念都清楚了吧,那么插入的原理就很简单了。

比如说我们插入一个20到这棵树中。

首先:20跟50比,发现20是老小,不得已,得要归结到50的左子树中去比较。

然后:20跟30比,发现20还是老小。

再然后:20跟10比,发现自己是老大,随即插入到10的右子树中。

最后: 效果呈现图如下:

算法系列15天速成——第六天 五大经典查找【下】

<2>查找:相信懂得了插入,查找就跟容易理解了。

就拿上面一幅图来说,比如我想找到节点10.

首先:10跟50比,发现10是老小,则在50的左子树中找。

然后:10跟30比,发现还是老小,则在30的左子树中找。

再然后: 10跟10比,发现一样,然后就返回找到的信号。

<3>删除:删除节点在树中还是比较麻烦的,主要有三种情况。

《1》 删除的是“叶节点20“,这种情况还是比较简单的,删除20不会破坏树的结构。如图:

算法系列15天速成——第六天 五大经典查找【下】

《2》删除”单孩子节点90“,这个情况相比第一种要麻烦一点点,需要把他的孩子顶上去。

算法系列15天速成——第六天 五大经典查找【下】

《3》删除“左右孩子都有的节点50”,这个让我在代码编写上纠结了好长时间,问题很直白,

我把50删掉了,谁顶上去了问题,是左孩子呢?还是右孩子呢?还是另有蹊跷?这里我就

坦白吧,不知道大家可否知道“二叉树”的中序遍历,不过这个我会在后面讲的,现在可以当

公式记住吧,就是找到右节点的左子树最左孩子。

比如:首先 找到50的右孩子70。

然后 找到70的最左孩子,发现没有,则返回自己。

最后 原始图和最终图如下。

算法系列15天速成——第六天 五大经典查找【下】 算法系列15天速成——第六天 五大经典查找【下】

3.说了这么多,上代码说话。

复制代码
        
        
        
          
            复制代码
          
        
      

运行结果:

算法系列15天速成——第六天 五大经典查找【下】

值的注意的是:二叉排序树同样采用“空间换时间”的做法。

突然发现,二叉排序树的中序遍历同样可以排序数组,呵呵,不错!

PS: 插入操作:O(LogN)。

删除操作:O(LogN)。

查找操作:O(LogN)。

算法系列15天速成——第六天 五大经典查找【下】


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论