java手撕红黑树,左旋、右旋、变色、及红黑树的设计概念

本文介绍了红黑树的基本概念,包括节点结构、插入操作、左旋、右旋规则以及红黑树的平衡策略。通过Java代码展示了插入节点时如何进行旋转和变色,解释了为何进行这些操作以保持树的平衡,并探讨了红黑树的设计理解。
摘要由CSDN通过智能技术生成

理念:只要你把事情分的足够简单,系统就不会出错。

一、总览:首先我们来看一下一颗简单的树是什么结构。


二、节点:很明显,一颗树是由一个个简单的节点组成的,所以要想搞清红黑树,首先熟悉最简单的节点。
为了简化便于理解,每个节点的值用int格式。
红黑树节点的组成:值、左孩子、右孩子、父节点、颜色。用java代码表示如下:

class RBNode{
        int value;
        boolean color;//true = 黑,false = 红
        RBNode farther;
        RBNode left;
        RBNode right;
        }

三、明白了单个节点的结构,我们学习一下树的插入。
        1、找到合适的节点
        2、当前值比节点小且节点左节点为空,插入左孩子位置,反之插入右孩子位置,前提是孩子为空。
       找孩子我们代码用递归的思想去做,首先找的是根节点,在类中是个全局变量root。java代码实现如下。

public void put(int value){
        if(root == null) {
            root = new RBNode(value, true, null, null, null);
        }else {
            putNode(root,value);
        }

    }
    
    private void putNode(RBNode node,int value){
        if(value < node.value){//1、比node小
            if(node.left == null){//1.1、 左孩子空,放入左孩子
                RBNode newNode = new RBNode(value, RED, node, null, null);
                node.left = newNode;
                return;
            }else {//1.2、 左孩子不为空,递归左孩子
                putNode(node.left,value);
            }
        }else {//2、比node大
            if(node.right == null){// 2.1、右孩子为空,放入右孩子
                RBNode newNode = new RBNode(value, RED, node, null, null);
                node.right = newNode;
                return;
            }else {//2.2 右孩子不为空,递归右孩子
                putNode(node.right,value);
            }
        }
    }

四、上面学会了,只能建立一个简单二叉树,不是平衡的,要想要树平衡,首先要学两个规则,左旋和右旋。

左旋:把一个节点看成一个三角形,左旋就是向左旋转(逆时针),就是下图中 5  替代 2 的位置。

左旋官话:右节点替代根节点,根节点变为右节点的左节点,右节点的左节点变为根节点的右节点(绕的一比)。

左旋分两步:1、5替代2的位置(根节点2往左旋,右孩子5上位替代自己的位置)。

                       2、5的左孩子变为2的右孩子(2上位当老大,左孩子4不要,扔给退位的老大2来收养)。

注意:旋转是指根节点旋转,即主角是2,针对2来说的。

           左旋后                  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值