红黑树树插入后自平衡

个人小博客-》 :欢迎来到我的领域
/**
 * 递归方式在插入后自平衡  2022-10-10  众人皆醒吾独醉 ---吾本孤立无援
 */
private void balanceInsertRecursion(RbTreeNode node) {
    if (node.getParent() == null) {
        this.root = node;
        return;
    }
    if (node.getParent().getParent() == null) {
        return;
    }

    //
    RbTreeNode thisNodeFather = node.getParent();

    if (thisNodeFather.color) {
        //红色才违背,才需要调整
        return;
    }

    //他爷
    RbTreeNode thisNodeGdFather = node.getParent().getParent();
    //他叔还未知
    RbTreeNode thisNodeUncle = null;

    //用于确定位置 0 =l  1= r
    int fatherIsLeftOrRightChild = -1;
    int nodeIsLeftOrRightChild = -1;

    //定位father 、找叔
    if (thisNodeFather.equals(thisNodeGdFather.getLeftChild())) {
        fatherIsLeftOrRightChild = 0;
        thisNodeUncle = thisNodeGdFather.getRightChild();
    } else {
        fatherIsLeftOrRightChild = 1;
        thisNodeUncle = thisNodeGdFather.getLeftChild();
    }

    if (node.equals(thisNodeFather.getLeftChild())) {
        nodeIsLeftOrRightChild = 0;
    } else {
        nodeIsLeftOrRightChild = 1;
    }

    //开始调整
    if (thisNodeUncle != null && !thisNodeUncle.color) {
        //他叔为红--只需要染色即可
        thisNodeFather.color = true;
        thisNodeUncle.color = true;
        thisNodeGdFather.color = false;

        //以gdfather继续向上递归
        balanceInsertRecursion(thisNodeGdFather);

    } else {
        //这时候不能简单染色了,需要双旋或单旋,平衡节点,旋转得按上方节点定位 判断 做左旋还是右旋。
        if (0 == fatherIsLeftOrRightChild) {
            if (1 == nodeIsLeftOrRightChild) {
                //双旋
                leftRotate(thisNodeFather);
            }
            rightRotate(thisNodeGdFather);
            //gdfather 必为黑 右旋后会 在右多一黑,所以得变红,插入点旋到 gd得位置,得变黑
            node.setColor(true);
            thisNodeGdFather.setColor(false);
        } else {
            if (0 == nodeIsLeftOrRightChild) {
                rightRotate(thisNodeFather);
            }
            leftRotate(thisNodeGdFather);
            node.setColor(true);
            thisNodeFather.setColor(false);
        }
    }
    //保证根为黑
    this.root.setColor(true);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值