一、二叉查找树,Binary Search Tree 「BST」,
1、特性:
(1)某节点的左子树节点值仅包含小于该节点值
(2)某节点的右子树节点值仅包含大于该节点值
2、查找:
比根节点大则从右子树查找,比根节点小则从左子树查找,
二、平衡二叉树
解决二叉树可能单腿问题。
平衡二叉树,也叫作AVL树。
特点:
(1)从任何一个节点出发,左右子树深度之差的绝对值不超过1。
(2)左右子树仍然为平衡二叉树。
插入:
平衡二叉树在插入时最多只需要两次旋转就会重新恢复平衡。
平衡二叉树vs红黑树,问题:
1)删除:对于平衡二叉树来说,在最坏情况下,需要维护从被删节点到根节点这条路径上所有节点的平衡性,旋转的量级是O(logN)。但是红黑树就不一样了,最多只需3次旋转就会重新平衡,旋转的量级是O(1)。
2)保持平衡:平衡二叉树高度平衡,这也就意味着在大量插入和删除节点的场景下,平衡二叉树为了保持平衡需要调整的频率会更高。
三、红黑树左旋、右旋、插入、删除:https://www.jianshu.com/p/30afcf59828f
1.查找、插入、删除等操作,的时间复杂度为O(lgn),即高度。
查找过程和二叉查找树一样,查找元素比当前节点大,就从右子树继续查找比较,查找元素比当前节点小,就从左子树继续查找比较。
2.红黑树节点插入,无需启动自动平衡机制调整节点平衡状态。
(1)变色
(2)左左节点旋转
(3)左右节点旋转
(4)右左节点旋转
(5)右右节点旋转
3.红黑树节点删除
()删除的是根节点,则直接将根节点置为 null。
待删除节点的左右子节点都为null,删除时将该节点置为null。
待删除节点的左右子节点有一个有值,则用有值的节点替换该节点即可。
待删除节点的左右子节点都不为 null,则找前驱或者后继,将前驱或者后继的值复制到该节点中,然后删除前驱或者后继。
节点删除后可能会造成红黑树的不平衡,这时我们需通过【变色】+【旋转】的方式来调整,使之平衡,上面也给出了例子,建议大家多多练习,而不必背下来。
4.红黑树性质:自平衡二叉查找树
发明人:鲁道夫·贝尔
别名:对称二叉B树、二叉树
用途:实现关联数组
红黑树,Red-Black Tree 「RBT」是一个自平衡(不是绝对的平衡)的二叉查找树(BST),红黑树的5个性质:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶子结点都是黑的,且为null。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对每个结点,从该结点到其子孙结点的所有路径上包含相同数目的黑结点。
没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点,并没有说不能出现连续的黑色节点)
从节点(包括根)到其任何后代NULL节点(叶子结点下方挂的两个空节点,并且认为他们是黑色的)的每条路径都具有相同数量的黑色节点
连接红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点)。
从任意节点出发,到其每个叶子节点的路径中包含相同数量的黑色节点。
新加入到红黑树的节点为红色节点。
隐藏了哪些意思呢?
①从根节点到叶子节点的最长路径不大于最短路径的2倍
②为什么说新加入到红黑树中的节点为红色节点
5、红黑树的应用真的是太多了,比如说java中的HashMap和TreeMap。还有就是linux也经常使用到。这种数据结构在面试的时候是一个常问问题,希望大家能够明白和理解。如何用java手撕红黑树
https://baijiahao.baidu.com/s?id=1645429373049393021
浙公网安备 33010602011771号