红黑树及红黑树矩阵

本文详细介绍了红黑树的概念,包括其特性、旋转操作(左旋、右旋)以及插入节点后的调整策略。红黑树是一种自平衡二叉查找树,保证了任何节点到其叶子节点的路径都包含相同数量的黑色节点,从而保持相对平衡。文章还提及了删除操作,包括寻找节点后继和删除调整的初步介绍。
摘要由CSDN通过智能技术生成

R-B Tree

简介

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的平衡二叉树,在java中,TreeMap和HashMap都有用到它。

特性

(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

旋转

红黑树的旋转只有两种,左旋和右旋,比平衡二叉树少了两种。
在这里插入图片描述

// Rotate Left
private void rotateLeft(Entry<K,V> p) {
   
    if (p != null) {
   
        Entry<K,V> r = p.right;
        p.right = r.left;
        if (r.left != null)
            r.left.parent = p;
        r.parent = p.parent;
        if (p.parent == null)
            root = r;
        else if (p.parent.left == p)
            p.parent.left = r;
        else
            p.parent.right = r;
        r.left = p;
        p.parent = r;
    }
}
//Rotate Right
private void rotateRight(Entry<K,V> p) {
   
    if (p != null) {
   
        Entry<K,V> l = p.left;
        p.left = l.right;
        if (l.right != null) l.right.parent = p;
        l.parent = p.parent;
        if (p.parent == null)
            root = l;
        else if (p.parent.right == p)
            p.parent.right = l;
        else p.parent.left = l;
        l.right = p;
        p.parent = l;
    }
}

插入调整

//红黑树调整函数fixAfterInsertion()
// 定义变换条件为偏序(p==,y==,pp==,x==)
// 定义变换向量为偏序(p=>,y=>,pp=>,x=,{})
// 定义偏序中0为条件忽略。
private void fixAfterInsertion(Entry<K,V> x) {
   
    x.color = RED;
    while (x != null && x != root && x.parent.color == RED) {
   
        if (parentOf(x) == leftOf(parentOf(parentOf(x)))) {
   
        	// 父节点为左节点(p==pp->left)
        	// 此时有三种情况
            Entry<K,V> y = rightOf(parentOf(parentOf(x)));
            if (colorOf(y) == RED) {
   //当y为null时,视为BLACK
            	// 若父亲p为左节点(p==pp->left),
            	// 若大伯y(pp->other)为R,
            	// 那么为情况1.(p==left,y==R,0,0)--->(p=>B,y=>B,pp=>R,x=pp,{0})
                setColor
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值