数据结构:手撕红黑树(python方式)

前言:不知道同学有没有看完昨天的B树和B+树,虽说那个B+树在面试中很少被要求手写,但是有一个常考的考点,红黑树,可以一个经常被问到的知识噢,那么今天,我就来跟大家一起手撕红黑树!

红黑树

说到红黑树不得不先提一下AVL树(平衡二叉搜索树),不了解AVL树的同学可以自行查询相关文献,然后回来以后,请回答我的两个问题:

红黑树和AVL树的区别是什么?

1.附上红黑颜色属性,通过颜色控制树的平衡
2.相对于AVL树来说,没有那么严格的要求平衡
3.插入和删除的复杂度和次数较AVL来说,跟随着数量节点的增大,越能体现出红黑树的快捷
4.叶子节点都是NuLL

那红黑树自己有什么独特的地方吗?

1.红黑树要求根节点和叶子结点都是黑色
2.红黑树的红色节点不可以相连
3.红黑树的根节点到任一叶子节点的距离中,黑色节点都是相同的,俗称黑高
在这里插入图片描述

通过上面的图片应该很容易理解到它的特性吧,根据它的颜色属性,我们可以通过颜色的一定规律使得我们的树便平衡,不要问问什么通过红黑的颜色就可以使树平衡,我在刚学的时候也有这个疑问,但是事实证明,先理解,后实现,最后才是深入了解这个规律是如何产生的噢.
在我们手写红黑树之前,一定要捋清楚思路在做,不要以为自己听懂了一遍,就可以直接实现,里面是有很多需要注意的细节,这里小编是建议大家先把整个过程需要的函数和思路先备注上哦,下面是我从老师那里截得图,不过使用java实现的,我呢,则是用python实现的,不过大同小异,只是想告诉你整个过程的书写方式
在这里插入图片描述
左旋如图:
在这里插入图片描述
右旋如图:
在这里插入图片描述
为了方便大家理解,左右旋,附上上述两张图,可以参考,这个可能有点难理解,因为图上仅仅是简单的几个节点,而在真实的树中,它是有很多子节点连接的,当然本质上其实很简单,在下面的代码中,我会体现出它的规律性所在,为了防止大家在观看代码的过程中疑惑,我几乎每步的核心都做了备注,希望大家在看完细致的视频讲解以后,如果没有思路的话,可以从我的代码中了解一下python实现红黑树的细节

Python实现红黑树

# 定义节点
class Node(object):
    def __init__(self, key=None, value=None):
        self.key = key
        self.value = value
        self.left = None
        self.right = None
        self.parent = None
        self.color = 0  # 默认黑色0,红色1


class RedBlackTree(object):

    def __init__(self):
        self.root = None

    # 设置节点为红色
    def set_red_color(self, node):
        if node is not None:
            node.color = 1

    # 设置节点为黑色
    def set_black_color(self, node):
        if node is not None:
            node.color = 0

    # 判断是否是红色节点
    def is_red_color(self, node):
        if node is not None:
            if node.color == 1:
                return True
            else:
                return False
        else:
            return False

    # 判断是否是黑色节点
    def is_black_color(self, node):
        if node is not None:
            if node.color == 0:
                return True
            else:
                return False
        else:
            return False

    # 得到爷爷节点
    def get_grandparent(self, node):
        
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值