搜索二叉树、AVL树、红黑树、SBT树

在大量的面试中,红黑树包括某种AVL树 这些概念只会用即可,代码细节可以不做要求,要知道原理。

搜索二叉树

搜索二叉树的定义:对于一棵二叉树中的任意子树,其左子树上的所有数值小于头结点的数值,其右子树上所有的数值大于头结点的数值,并且树中不存在数值相同的结点。也称二叉查找树。

一个标准的 搜索二叉树,内部是没有重复值的!
例子:
在这里插入图片描述
在哈希表中,也有key和value。但我们不关注key的排序,哈希表中的key是根据哈希函数分的桶,详见哈希表

哈希表内部的 key是散乱组织的!

可以认为treemap是搜索二叉树结构。
给定一个key和value,通过一个key来查询是否存在于 map,也可通过key,取出value。
这是因为在treemap中,key是通过某种方式有序组织起来的!

当key按序组织之后,可以完成更多的功能,就是treemap所能提供的 hashmap不能提供的 一些功能。
比如对于这样一个 搜索二叉树
要查找5的话,先来到头结点4,小于5,那么在头结点的右子树继续找
来到6,那么必然 在6的左子树继续找
在这里插入图片描述
对于这样一棵树,确实是 搜索二叉树,但是不是平衡二叉树。
非常不平衡。
当 搜索二叉树 非常不平衡的时候,复杂度为O(N),而平衡性较好时(相当于二分法了),可以做到 O(logN);
在这里插入图片描述
搜索二叉树 如果不做调整的话,平衡性 和输入规律是有关的,如下面两个例子:
在这里插入图片描述
在这里插入图片描述
增删改查 复杂度都是O(1),只不过频率不一样

AVL树

AVL树是一种具有严苛平衡性的搜索二叉树。什么叫做严苛平衡性呢?那就是所有子树的左子树和右子树的高度相差不超过1。弊端是,每次发现因为插入、删除操作破坏了这种严苛的平衡性之后,都需要作出相应的调整以使其恢复平衡,调整较为频繁。

红黑树

红黑树是每个节点都带有颜色属性的搜索二叉树,颜色或红色或黑色。在搜索二叉树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:
性质1. 节点是红色或黑色。
性质2. 根节点、每个叶节点(NIL节点,空节点)是黑色。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
性质5:在这里插入图片描述

SBT树

它是由中国广东中山纪念中学的陈启峰发明的。陈启峰于2006年底完成论文《Size Balanced Tree》,并在2007年的全国青少年信息学奥林匹克竞赛冬令营中发表。
相比红黑树、AVL树等自平衡二叉查找树,SBT更易于实现。据陈启峰在论文中称,SBT是“目前为止速度最快的高级二叉搜索树”。SBT能在**O(log n)**的时间内完成所有二叉搜索树(BST)的相关操作,而与普通二叉搜索树相比,SBT仅仅加入了简洁的核心操作Maintain。由于SBT赖以保持平衡的是size域而不是其他“无用”的域,它可以很方便地实现动态顺序统计中的select和rank操作。
SBT树的性质是:对于数中任意结点,以该结点为根节点的子树的结点个数 不能比以该结点的叔叔结点为根节点的子树的结点个数大。

在这里插入图片描述
比如Y作为根节点,其形成的节点,不能比子侄节点Z1或者Z2上 形成的节点数 少。
这样左树 和 右数的规模 还是差不多的
在这里插入图片描述
当我把平衡性阉割到一定程度的时候,我的调整可以不那么频繁。
比如AVL树,最最最严苛平衡性的搜索二叉树,所有子树的左子树和右子树的高度相
差不超过1,意味着 几乎每次插入都需要调整。
而红黑树 平衡性 没有那么 严苛,那么意味着调整的次数 没有AVL树 那么多。
所以讲了那么多树,本质上都是玩 平衡性,使得使用的时候不再那么频繁。

由于红黑树的实现较为复杂,因此现在工程中大多使用SBT树作为平衡二叉树的实现

30.00讲代码:

抽象搜索二叉树,这个代码非常棒!
在这里插入图片描述
给定一个值element,如果这棵树上 有这个值,则返回节点node:
在这里插入图片描述
while条件不满足,说明已经找到了node,直接返回。

如果没有找到,则node为空,同样返回该node。

如果当前值小于 node,则左移:
在这里插入图片描述
插入方法:
在这里插入图片描述
这段while 即 找到不能再找了(小于就往左数跑,大于就往右数跑,在找下去都是空节点了)
在这里插入图片描述
然后,新的节点就知道了,该在哪个节点插入我也知道了!下面为插入节点的函数!
在这里插入图片描述

下面讲如何删除节点:
节点x有一个节点5,5有左孩子,没有右孩子,
要求 删除5 的话,
直接将4移到5的位置,
即x的右孩子直接变成4,然后删除5
在这里插入图片描述
但是,若是左右 孩子双全的情况,如下:
要删除5节点,就不好搞了。
在这里插入图片描述
我们拿 整棵右子树最左的节点 代替5!(也可以是左子树最右的节点)
这两种方法。不会破坏 搜索二叉树的性质:左子树都比根节点小,右子树都比根节点大。
例子:
在这里插入图片描述
拿6代替5, 6的左孩子接管原先5的左孩子。
那么6之前的右孩子怎么办呢?
在这里插入图片描述
移交给7!
在这里插入图片描述
当然删除5,也可以用4来顶。
在这里插入图片描述
4是5的前驱节点。6是5的后继节点。
前驱节点、后继节点都是中序遍历的概念。

左旋:
在这里插入图片描述
顺时针旋例子:
在这里插入图片描述
顺时针转(又称为右旋,头结点变为新头结点的右孩子):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
左旋(原来的头节点变为新头节点的左孩子):
在这里插入图片描述
在这里插入图片描述
AVL树是如何 发现不平衡性的。
在这里插入图片描述
顺着路径把右节点的数都改掉。
在这里插入图片描述
此时4左右节点相差不大于1,还是平衡的

再次插入6
在这里插入图片描述
在这里插入图片描述
改完以后就会发现4左右不平衡。
这时候发生左旋。
在这里插入图片描述
对于一个经典的节点,
有 指向父节点的指针
有 指向左子树的指针
有 指向右子树的指针
有 指向 自身值 的指针
在这里插入图片描述
对于AVLnode封装了一个高度的变量。
在这里插入图片描述
AVL树 继承的是 能够自我balance的 搜索二叉树。
在这里插入图片描述
插入一个节点后
通过rebalance 来发现是否平衡
在这里插入图片描述
具体来说:
在这里插入图片描述
首先找到其父节点,在这里插入图片描述

一个节点本身就有一个高度值,
其左树每一个节点都有一个值,
如果左子树存在,则node的高度 为左孩子 left的高度H
如果左子树不存在,则node的高度 为 -1
在这里插入图片描述
所以这两行节点结束后,得到高度
在这里插入图片描述
然后:
在这里插入图片描述
若等于-2,说明右树超了
若等于2,说明左树超了
右树超了,进行AVL调整:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
左树右树最高的节点数+我当前的节点。
在这里插入图片描述
总之,从node开始,找到左子树高度,右子树高度,看是否平衡,如果不平衡,调整。
调整后,回调父节点,
在这里插入图片描述
继续回调:
在这里插入图片描述

父节点也可以进一步得到其左右节点的高度。若不平衡,则调整
每种平衡二叉树都有自己的一套在插入、删除等操作改变树结构而破坏既定平衡性时的应对措施(但都是左旋操作和右旋操作的组合),以AVL数为例(有四种平衡调整操作,其中的数字只是结点代号而非结点数值):
AVL有四种组合动作,
LL 调整:
左树超了
在这里插入图片描述
在这里插入图片描述
相应代码:
在这里插入图片描述
头结点跑到了新节点的右孩子上,所以是 右旋。
所以,这一部分是 LL型处理???
在这里插入图片描述
右树超了用RR型
进行一个左旋操作。

RL情况:
在这里插入图片描述
还是左树较高

先在这样局部,使4变为头结点。
在这里插入图片描述
即以3作为头结点 旋转:
在这里插入图片描述
接下来便是LL型操作,
在这里插入图片描述
总结,对于RL情况,先进行左旋,在进行右旋。

面试的时候,不会要求 手撸平衡搜索二叉树。但是怎么使用 平衡搜索二叉树的结构,会考!
01.20.50 开始讲 主函数main
在这里插入图片描述
在这里插入图片描述
返回树内 刚刚比这个数 大的数:
在这里插入图片描述
哈希表要做到这三项,都要承担O(N)的代价,
但是treemap 只需要O(NlogN),因为整个key是按有序组织的!
在这里插入图片描述
如果只是 通过key查value这一个行为,
没有必要用treemap,也没必要用红黑树,也没必要用AVL,没必要用任何一个平衡搜索二叉树

但如果希望key是按序组织的!且十分频繁查询(即希望查询效率变高),则可以选择一个平衡搜索二叉树的操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值