当前位置: 首页 > news >正文

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

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

  • 1.红黑树类的定义
  • 2.左旋函数和右旋函数
  • 3.对插入结点的修复

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{//LRif (target == target->parent->right){leftRotate(target->parent);rightRotate(target->parent);target->color = Color::BLACK;target->right->color = Color::RED;}//LLelse 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{//RLif (target == target->parent->left){rightRotate(target->parent);leftRotate(target->parent);target->color = Color::BLACK;target->left->color = Color::RED;}//RRelse if (target == target->parent->right){leftRotate(target->parent->parent);target->parent->color = Color::BLACK;target->parent->left->color = Color::RED;}}	}}root->color = Color::BLACK;
}

http://www.mrgr.cn/news/37004.html

相关文章:

  • 【系统架构设计师】需要掌握的专业术语200个及简称
  • HttpServletRequestWrapper这个类有什么作用?
  • (done) 使用泰勒展开证明欧拉公式
  • vscode【实用插件】Project Manager 项目管理
  • 2.2 HuggingFists中的编程语言
  • 2023_Spark_实验十:Centos_Spark Local模式部署
  • 【重学 MySQL】四十、SQL 语句执行过程
  • C++类和对象——第二关
  • 从自身经历浅谈对于C++/Java的认识
  • 华为NAT ALG技术的实现
  • 鸿蒙开发(NEXT/API 12)【硬件(取消注册智慧出行连接状态的监听)】车载系统
  • 【Java】字符串处理 —— String、StringBuffer 与 StringBuilder
  • 找到你的工具!5款免费可视化报表工具对比分析
  • 什么是 Servlet? 它的主要用途是什么?
  • 行情叠加量化,占据市场先机!
  • WAF,全称Web Application Firewall,好用WAF推荐
  • UGUI动态元素大小的滑动无限列表
  • 哈希表(一)
  • 【Python语言初识(五)】
  • 828华为云征文|使用Flexus X实例安装宝塔面板教学