红黑树(Red Black Tree)基本性质 + 建树

定义


红黑树:一种特殊的二叉搜索树
二叉搜索树:一种树的类型,每个节点最多有两个子节点,其中其左节点一定小于当前节点,右节点一定大于当前节点

二叉树的缺点:如果给定的初始序列顺序不好,可能会建出类似于链表的结构,对搜索速度全无助益

请添加图片描述
红黑树的目的:构建一棵趋于平衡的二叉搜索树,杜绝bad case的出现情况

性质


红黑树树节点的组成

  • 左孩子 left (树节点)
  • 右孩子 right (树节点)
  • 父节点 parent (树节点)
  • 颜色 color (红/黑)
  • 值 value (任意)

红黑树的特点

  • 没有一条路径会比其他路径长出2倍

合法红黑树的性质

  • 每个节点都是红色或者黑色的
  • 根节点是黑色
  • 叶节点*是黑色
  • 如果一个节点是红色的,他的两个孩子都应该是黑色
  • 对每个结点,从该节点到其所有后代的叶子节点的简单路径上,包含相同数目的黑色节点

其中,最后一个性质确保了红黑树的相对“平衡”
*为了便于处理边界条件,红黑树中没有节点的孩子会直接指向None,通过定义一个通用哨兵NIL来代指None

NIL's param settings
	parent = None
	color = BLACK
	left = None
	right = None
	value = None

请输入图片描述
右图为红黑树的包含哨兵(nil)状态,为了方便,后图都将采用左图的方式绘制

基本操作(旋转)


旋转操作是红黑树的基本操作,旋转的示意图如下
请添加图片描述

旋转需要满足如下要求:

  • 左旋:需要左旋的树节点,其右孩子不为NIL
  • 右旋:需要右旋的树节点,其左孩子不为NIL

至于其他节点,由于存在哨兵NIL,变得易于处理,以左旋为例:

  • 事先定义:旋转的节点为N,它的右孩子为R,R的左孩子为RL(是NIL也无所谓),其他节点不需要关注。
  • S1:断开N和R
  • S2:N的右孩子为RL
  • S3:R的左孩子为N

下面给出左旋和右旋的python代码

    def _left_rotate(self, node):
        if node.right == self.nil:
            print("can't left rotate")
            return

        right = node.right
        parent = node.parent
        isLeft = parent.left == node

        if self.root == node:
            self.root = right

        if isLeft:
            parent.left = right
        else:
            parent.right = right
        right.parent = parent

        node.right 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值