首页 > 其他分享 >红黑树|定义、左旋函数、右旋函数和对插入结点的修复

红黑树|定义、左旋函数、右旋函数和对插入结点的修复

时间:2024-09-26 18:19:48浏览次数:3  
标签:node 结点 target parent color Color 红黑树 left 函数

红黑树|定义、左旋函数、右旋函数和对插入结点的修复

1.红黑树类的定义

enum class Color
{
	RED,
	BLACK
};

template<typename Key ,typename Value>
class RedBlackTree
{
	class Node 
	{
	public:
		Key key;
		Value value;
		Color color;
		Node* left;
		Node* right;
		Node* parent;
		
		Node()
			:color(Color::BLACK),left(NULL),right(NULL),parent(NULL)
		{}
		Node(const Key&key,const Value&value,Color color,Node*p=NULL)
			:key(key),value(value),color(color),left(NULL),right(NULL),parent(p)
		{}
	};

private:
	Node* root;
	size_t size;
	Node* Nil;
	};

2.左旋函数和右旋函数

//右旋函数
void rightRotate(Node* node)
{
	Node* p = node->left;
	//处理p的右孩子
	node->left = p->right;
	if (p->right != NULL)
		p->right->parent->node;
	//把p置为老大
	p->parent = node->parent;
	if (node->parent == NULL)
		root = p;
	if (node == node->parent->left)
		node->parent->left = p;
	else if (node == node->parent->right)
		node->parent->right = p;
	//让node成为p的右孩子
	p->right = node;
	node->parent = p;
}

//左旋函数
void leftRotate(Node* node)
{
	Node* p = node->right;
	node->right = p->left;
	if (p->left != NULL)
		p->left->parent = node;
	p->parent = node->parent;
	if (node->parent == NULL)
		root = p;
	if (node == node->parent->left)
		node->parent->left = p;
	else if (node == node->parent->right)
		node->parent->right = p;
	p->left = node;
	node->parent = p;
}

3.对插入结点的修复

void insertFixup(Node*target)
{
	while (target->parent != NULL && target->parent->color == Color::RED)
	{
		//父为祖左节点
		if (target->parent = target->parent->parent->left)
		{
			Node* uncle = target->parent->parent->right;
			//红叔
			if (uncle && uncle->color == Color::RED)
			{
				uncle->color == Color::BLACK;
				target->parent->color == Color::BLACK;
				target->parent->parent->color = Color::RED;
				target = target->parent->parent;
			}
			//黑叔
			else
			{
				//LR
				if (target == target->parent->right)
				{
					leftRotate(target->parent);
					rightRotate(target->parent);
					target->color = Color::BLACK;
					target->right->color = Color::RED;
				}
				//LL
				else if (target == target->parent->left)
				{
					rightRotate(target->parent->parent);
					target->parent->color = Color::BLACK;
					target->parent->right->color = Color::RED;
				}
			}
		}
		//父为祖的右节点
		else
		{
			Node* uncle = target->parent->left;
			//红叔
			if (uncle && uncle->color == Color::RED)
			{
				uncle->color == Color::BLACK;
				target->parent->color == Color::BLACK;
				target->parent->parent->color = Color::RED;
				target = target->parent->parent;
			}
			//黑叔
			else
			{
				//RL
				if (target == target->parent->left)
				{
					rightRotate(target->parent);
					leftRotate(target->parent);
					target->color = Color::BLACK;
					target->left->color = Color::RED;
				}
				//RR
				else if (target == target->parent->right)
				{
					leftRotate(target->parent->parent);
					target->parent->color = Color::BLACK;
					target->parent->left->color = Color::RED;
				}
			}	
		}
	}
	root->color = Color::BLACK;
}

标签:node,结点,target,parent,color,Color,红黑树,left,函数
From: https://blog.csdn.net/2402_84438596/article/details/142568364

相关文章

  • 18937 阿克曼(Ackmann)函数
    ###思路1.**递归定义**:根据阿克曼函数的定义,使用递归来计算函数值。2.**递归终止条件**:  -当`m==0`时,返回`n+1`��  -当`m>0`且`n==0`时,返回`ackermann(m-1,1)`。  -当`m>0`且`n>0`时,返回`ackermann(m-1,ackermann(m,n-1)......
  • 【YashanDB知识库】decode函数中的子查询被不必要地多次执行
    本文内容转自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7441387.html?templateId=1718516问题现象客户向yashandb下发的SQL语句执行时间超过6分钟仍未出结果问题的风险及影响SQL语句性能慢,影响客户业务问题影响的版本所有的yashandb22.2版本23.2版本没有这个问......
  • c语言中fork,exec和system函数的理解
    fork用于创建子进程。由fork创建的新进程被称为子进程(childprocess)。fork函数被调用一次,但返回两次。在父进程中,fork返回新创建子进程的进程ID。在子进程中,fork返回0。如果出现错误,fork返回一个负值。包含在<unistd.h>中,是Unix系统特有的文件(Macos并不太清楚),因此需要......
  • transformers中的generate函数解读
    转载:https://zhuanlan.zhihu.com/p/654878538这里仅当学习记录,请看原文,排版更丰富转载补充:https://www.likecs.com/show-308663700.html 这个非常的清晰明了,也建议前往学习今天社群中的小伙伴面试遇到了一个问题,如何保证生成式语言模型在同样的输入情况下可以保证同样的输出......
  • python使用win32gui、win32con窗口函数功能及参数意义
    使用python设置窗口显示、最大化、最小化、隐藏的时候,需要win32gui.ShowWindow(hwnd,win32con.SW_HIDE),那么对于的参数如下:ShowWindow函数的参数有:1.hWnd:窗口句柄,用于标识要操作的窗口;2.nCmdShow:指定窗口如何显示,可以是以下值:SW_HIDE:隐藏窗口并**其他窗口。nCmdShow=0。SW_......
  • python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
    一、python线程死锁与递归锁死锁现象所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程代码示例:fromthreadingimport......
  • vscode设置python解释器以及函数无法点击跳转问题
    1.下载插件1.1Python1.2Pylance1.3Remote-SSH2.设置本地/远程python解释器2.1本地设置2-1-1设置解释器路径设置自定义python解释器路径,mac快捷键command+p>python:selectinterpreter选择或者输入解释器2-1-2查看设置结果设置完python-venv路径后,打开......
  • 9.26递归函数
    递归函数的定义和格式递归是一种常用的解决问题的方法,特别适用于解决可以被分解为类似子问题//递归函数:在函数内部再次调用自己//解决可以被分解为类似子问题的问题//组成://1.基本情况最小问题的答案//2.递归情况调用自己去解决子问题objectTestFucRecursive{//......
  • Scala的函数
    objectTestFunc{//1.定义函数//Unit是表示无类似于void,意味着函数没有返回值deffn()={println("第一个函数")}//入口函数defmain(args:Array[String]):Unit={//2.调用函数fn()}}//def关键字,用来定义函数//简写1:没有......
  • Java高效编程(1):使用静态工厂方法替代构造函数
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界在Java编程中,传统上,类允许客户端获取实例的方式是提供一个公共构造函数。然而,还有一种重要的技术,应该成为每个程序员工具箱中的一部分,那就是使用公共的静态工厂方法。静态工厂方法是一个静态方法,返回类的实例。这......