普通人都能看懂的图解---红黑树(插入)

红黑树的插入操作

红黑的简单介绍 :

  1. 首先它是一个相对平衡的搜索二叉树
  2. 在这样的基础之上, 又有这5个要求
    1. 性质1. 节点是红色或黑色。
    2. 性质2. 根节点是黑色。
    3. 性质3.所有叶子都是黑色。(叶子是NULL节点)
    4. 性质4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
    5. 性质5… 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

与 同样是平衡搜索树的 AVL树 相比 有什么区别呢?

  1. 首先从查询效率上来说…AVL树严格的保证了平衡 ,查询效率 严格的 logn , 而 红黑树 , 只能保证 最长的路径 不会超过最短路径的2倍 , 这种相对的平衡 , 因此 但从 查询效率上, AVL 略胜一点点
  2. 但是在实际的情况下…很少有情况是一直查询 而不插入数据的 , 但是在插入数据的时候 , 由于 AVL的严格性 , 导致调整平衡的时候有很多的限制 , 多次旋转寻求平衡 , 而 红黑树 相对比较松散 , 发生旋转的次数比较少 , 因此在实际的使用情况下 , 红黑树 综合效率 比AVL 要高 (除非真的是搜索次数大于 插入/删除 次数)

在看图之前需要知道的事情 :

  1. 由于其性质5的规定, 导致 黑色节点 才是衡量 红黑树平衡的 关键 . 因此 插入的节点默认是 红色, 且不会发生变色 ( 因为尽量不要影响树的平衡 )
  2. 又因为插入的是 红色节点 且自己不会发生颜色的变化, 因此 叶子节点中 一定是有红色节点的存在

在这里插入图片描述



话不多说 图解!

文本从 红黑树 只有2种颜色节点的角度 来对插入进行分类 (话不多说 看图) (后文有代码)

在这里插入图片描述


代码实现

借鉴了 HashMap 中的红黑树 实现逻辑 (插入部分)

package structure;

/**
 * 借鉴于 HashMap下的红黑树的简单实现
 */
public class RedBlackTreeNode {
   
    RedBlackTreeNode leftNode;
    RedBlackTreeNode rightNode;
    RedBlackTreeNode parentNode;

    int value;
    boolean red;

    public RedBlackTreeNode(int value) {
   
        this.value = value;
    }

    //从局部的任意一个点 获取 根节点
    public RedBlackTreeNode root() {
   
        for (RedBlackTreeNode p = this; ; p = p.parentNode) {
   
            if (p.parentNode == null) return p;
        }
    }

    /**
     * 加入一个数据节点
     * 在 Hash Map 中 put 方法的返回值 是曾经的旧值
     * 这里 修改了一些 返回插入的新节点 或者是 已经存在的节点
     */
    public RedBlackTreeNode put(int value) {
   
        RedBlackTreeNode root = root(); //根节点
        for (RedBlackTreeNode p = root; ; ) {
   
            int dir;   //用来判断 是插入在左边 还是右边
            if (value > p.value) {
   
                dir = 1;    //右边
            } else if (value < p.value) {
   
                dir = -1;   //插入在左边 (但不一定是这个点)
            } else {
   
                return this;    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值