1、红黑树是一棵非严格的自平衡的二叉搜索树,在插入和删除树节点的同时通过特定算法来保持二叉查找树的平衡。若一棵二叉查找树是红黑树,则它的任一子树必为红黑树。
2、红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。除需满足二叉查找树的要求之外,对于任何有效的红黑树还需满足如下要求:
* 节点是红色或黑色。
* 根节点是黑色的
* 所有叶子都是黑色且为null。
* 每个红色节点的两个子节点都是黑色。(即从每个叶子到根的所有路径上不能有两个连续的红色节点)
* 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
* 新加入到红黑树的节点为红色节点;
3. 红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。最短路径即全是黑色节点的路径,而最长路径就是红色节点数量与黑色节点一样多的路径
4. 维持平衡主要通过两种方式【变色】和【旋转】,【旋转】又分【左旋】和【右旋】,两种方式可相互结合。
左旋:逆时针旋转两个节点,让一个节点被其右子节点取代,而该节点成为右子节点的左子节点
右旋:顺时针旋转两个节点,让一个节点被其左子节点取代,而该节点成为左子节点的右子节点
5. 插入算法
无法通过变色维持平衡的场景有四种:
* 1. 左左节点旋转:父节点和插入的节点都是左节点,规则如下:以祖父节点【右旋】,搭配【变色】
* 2. 左右节点旋转:先父节点【左旋】,然后祖父节点【右旋】,搭配【变色】
* 3.右左节点旋转:先父节点【右旋】,然后祖父节点【左旋】,搭配【变色】
* 4右右节点旋转:祖父节点【左旋】,搭配【变色】
6、删除算法
* 1. 子节点至少有一个为null:当待删除的节点的子节点至少有一个为null节点时,删除了该节点后,将其有值的节点取代当前节点即可,若都为null,则将当前节点设置为null,当然如果违反规则了,则按需调整,如【变色】以及【旋转】。
* 2. 子节点都是非null节点:
- step1:找到该节点的前驱或者后继
前驱:左子树中值最大的节点(可得出其最多只有一个非null子节点,可能都为null);后继:右子树中值最小的节点(可得出其最多只有一个非null子节点,可能都为null);前驱和后继都是值最接近该节点值的节点,类似于该节点.prev = 前驱,该节点.next = 后继。
- step2: 将前驱或者后继的值复制到该节点中,然后删掉前驱或者后继。如果删除的是左节点,则将前驱的值复制到该节点中,然后删除前驱;如果删除的是右节点,则将后继的值复制到该节点中,然后删除后继;
红黑树结构复习
最新推荐文章于 2023-08-24 10:59:05 发布