精妙的平衡查找树结构--红黑树的Lua实现(插入部分)

本文介绍了红黑树的基本概念、与AVL树的区别以及节点插入规则,强调了红黑树在插入操作上的优势。文章通过Lua代码展示了红黑树节点的插入过程,并提供了测试实例。
摘要由CSDN通过智能技术生成

在这里插入图片描述

红黑树(英语:Red–black tree)是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型用途是实现关联数组。它在1972年由鲁道夫·贝尔发明,被称为"对称二叉B树",它现代的名字源于Leo J. Guibas和罗伯特·塞奇威克于1978年写的一篇论文。红黑树的结构复杂,但它的操作有着良好的最坏情况运行时间。


一、红黑树的概念与AVL树的引入

红黑树区别于BinaryTree普通二叉树的特征是红黑树有自平衡的特性,保证二叉树的最大高度为Log2(N+1)
这点很重要;二叉平衡树;不会因为左右不平衡导致效率很差;
普通二叉树在build的过程中如果最坏情况并且查找的过程最坏的情况下时间复杂度可达到O(N), 这在大多数情况下是不可接受的;

了解红黑树之前先引入AVL树(平衡二叉树)的概念:
AVL树本质上是一颗二叉查找树,但是它又具有以下特点:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为平衡二叉树。
AVL树在插入节点的过程中如何保证树的平衡性(并不是每次调整所有的节点),在插入时检查树的叶子节点,找到第一个失去平衡的节点(最小失衡子树), 调整该节点(子树),整棵树就达到平衡了。

两者差异:
区别于AVL树的 “在AVL树中任何节点的两个子树的高度最大差别为一” 特性,红黑树对于此条特性的平衡性要求并没有那么严格,红黑树的自平衡性主要是通过颜色来维持的。
性能比较与使用场景:
1.红黑树的平衡性没有AVL树更强, 所以查找性能略微逊色AVL树一点点,但其实数量级都一样。
2.在插入与删除操作时,由于红黑树更少的节点旋转次数,性能稍强于AVL树。
(如果插入删除操作次数比较少,搜索操作比较频繁的情况下,使用AVL树优于红黑树,反之使用红黑树更优。)

二、红黑树与AVL树中的节点旋转概念:

AVL树维持平衡的四种Case:LL, RR, LR, RL (子节点-父节点-祖父节点) 三个节点的关系可以通过自己绘图来整理
LL (Left Node of Left Child 左孩子的左节点) 右旋
RR (Right Node of Right Child 右孩子的右节点) 左旋
LR (Left Node of Right Child 右孩子的左节点) 先左旋再右旋
RL (Right Node of Left Child 左孩子的右节点) 先右旋再左旋

三、红黑树中的节点插入规则:

1.如果(树为空)是根节点,直接标注为黑色;
2.如果(树不为空)不是根节点,则作为叶子结点插入并标注为红色;
3.如果插入后的叶子节点的父节点是黑色,则直接可以return;

如果插入后的叶子节点的父节点是红色,再检查父节点的兄弟节点(叔父节点)的颜色
3.1.如果叔父节点都为红色,且祖父节点为根节点,则给父节点和祖父节点染色为黑色,祖父节点染色为红色,并对祖父与叔祖父节点递归向上执行该逻辑。
3.2.如果叔父节点为黑色或空节点,则执行适宜的旋转(上文提到的四种旋转)后重新染色。

四、代码实现部分:

1.Node节点类

代码如下(示例):

Class = require "Class"
local TreeNode = Class("TreeNode")

TreeNode.__init = function(self, key, value, color)
	self.key = key
	self.value = value
	self.left = nil
	self.right = nil
	self.height = 1
	self.color = color or "red"
end

local function isRed(node)
	return node.color
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值