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

浙江台州网站制作本地的佛山网站建设

浙江台州网站制作,本地的佛山网站建设,怎么在本地安装网站,淘宝客怎么做网站管理一、红黑树核心性质 红黑树是自平衡二叉搜索树,需满足5条性质: 节点非红即黑根节点必须为黑叶子节点(NIL)均为黑红色节点子节点必为黑(无连续红节点)任意节点到叶子路径的黑节点数相同(黑高度…

一、红黑树核心性质

红黑树是自平衡二叉搜索树,需满足5条性质:

  1. 节点非红即黑
  2. 根节点必须为黑
  3. 叶子节点(NIL)均为黑
  4. 红色节点子节点必为黑(无连续红节点)
  5. 任意节点到叶子路径的黑节点数相同(黑高度一致)

二、C++节点结构定义

enum Colour { RED, BLACK };template <typename K, typename V>
struct RBTreeNode {K key;V value;Colour color;RBTreeNode *left, *right, *parent;RBTreeNode(K k, V v) : key(k), value(v), color(RED), left(nullptr), right(nullptr), parent(nullptr) {}
};

节点默认红色以最小化插入调整代价


三、插入操作详解

步骤1:二叉搜索树插入
bool Insert(const pair<K, V>& kv) {if (!root) { root = new Node(kv, BLACK); return true; }// 查找插入位置(同普通BST)//...// 新节点插入为红色cur = new Node(kv);cur->color = RED;parent->left/right = cur;cur->parent = parent;// 进入调整逻辑FixInsert(cur);
}
步骤2:插入后调整(FixInsert)
情况1:叔节点为红
祖父节点-黑
父节点-红
叔节点-红
新节点-红

处理方案
父、叔变黑,祖父变红,递归处理祖父节点

parent->color = uncle->color = BLACK;
grandfather->color = RED;
cur = grandfather; // 向上递归
情况2:叔节点为黑(直线型)
祖父
父-红
新节点-红
叔-黑

处理方案
祖父右旋,父变黑,祖父变红

RotateR(grandfather);
parent->color = BLACK;
grandfather->color = RED;
情况3:叔节点为黑(折线型)
祖父
父-红
新节点-红
NULL

处理方案
先左旋父节点转换为直线型,再按情况2处理

RotateL(parent);
RotateR(grandfather);

四、删除操作核心逻辑

步骤1:BST标准删除
void Delete(K key) {Node* target = Search(key);if (!target) return;// 处理单子节点/叶子节点删除//...// 若删除黑色节点需进入双黑修正if (target->color == BLACK) FixDoubleBlack(replacement);
}
步骤2:双黑修正(FixDoubleBlack)
情况1:兄弟节点为红
父-黑
兄-红
当前节点-黑
左子-黑
右子-黑

处理方案
父节点左旋,兄弟变黑,父变红

RotateL(parent);
sibling->color = BLACK;
parent->color = RED;
情况2:兄弟节点为黑且远侄子为红
父-红
兄-黑
远侄子-红

处理方案
父节点左旋,远侄子变黑,父继承原父颜色

RotateL(parent);
sibling->right->color = BLACK;
parent->color = original_color;

五、旋转操作代码实现

左旋示例:
左旋前结构
左旋后结构
左指针
右指针
右指针
右指针
左指针
右指针
父节点P
当前节点X
右子节点Y
Y的左子树α
Y的右子树β
当前节点X
新父节点Y
原父节点P
α子树
β子树

关键步骤解析​:

  1. 原父节点P的右子节点Y上升为新父节点
  2. 将Y的左子树α挂载到X的右子树
  3. 原父节点P的右指针指向Y
  4. Y的左指针指向X(形成父子关系反转)
void RotateL(Node* x) {Node* y = x->right;x->right = y->left;if (y->left) y->left->parent = x;y->parent = x->parent;if (!x->parent) root = y;else if (x == x->parent->left) x->parent->left = y;else x->parent->right = y;y->left = x;x->parent = y;
}

右旋对称实现


六、示例

10
20
30
40
50
60
70

七、完整代码

#include <iostream>
using namespace std;enum Colour { RED, BLACK };template<class K, class V>
struct RBTreeNode {pair<K, V> _kv;Colour _col;RBTreeNode<K, V>* _left;RBTreeNode<K, V>* _right;RBTreeNode<K, V>* _parent;RBTreeNode(const pair<K, V>& kv): _kv(kv),_col(RED),_left(nullptr),_right(nullptr),_parent(nullptr) {}
};template<class K, class V>
class RBTree {typedef RBTreeNode<K, V> Node;
public:RBTree() {NIL = new Node(make_pair(K(), V()));NIL->_col = BLACK;_root = NIL;}bool Insert(const pair<K, V>& kv) {if (_root == NIL) {_root = new Node(kv);_root->_col = BLACK;_root->_left = _root->_right = NIL;return true;}Node* parent = NIL;Node* cur = _root;while (cur != NIL) {parent = cur;if (cur->_kv.first > kv.first)cur = cur->_left;else if (cur->_kv.first < kv.first)cur = cur->_right;elsereturn false;}Node* newNode = new Node(kv);newNode->_left = newNode->_right = NIL;if (parent->_kv.first > kv.first)parent->_left = newNode;elseparent->_right = newNode;newNode->_parent = parent;FixInsert(newNode);return true;}private:Node* _root;Node* NIL; // 哨兵节点[2,4]// 左旋修正void RotateL(Node* x) {Node* y = x->_right;x->_right = y->_left;if (y->_left != NIL)y->_left->_parent = x;y->_parent = x->_parent;if (x->_parent == NIL)_root = y;else if (x == x->_parent->_left)x->_parent->_left = y;elsex->_parent->_right = y;y->_left = x;x->_parent = y;}// 右旋修正void RotateR(Node* x) {Node* y = x->_left;x->_left = y->_right;if (y->_right != NIL)y->_right->_parent = x;y->_parent = x->_parent;if (x->_parent == NIL)_root = y;else if (x == x->_parent->_right)x->_parent->_right = y;elsex->_parent->_left = y;y->_right = x;x->_parent = y;}void FixInsert(Node* z) {while (z->_parent->_col == RED) {Node* g = z->_parent->_parent;if (z->_parent == g->_left) {Node* u = g->_right;if (u->_col == RED) { // Case 1z->_parent->_col = BLACK;u->_col = BLACK;g->_col = RED;z = g;} else {if (z == z->_parent->_right) { // Case 2z = z->_parent;RotateL(z);}// Case 3z->_parent->_col = BLACK;g->_col = RED;RotateR(g);}} else { // 对称处理[4,6]Node* u = g->_left;if (u->_col == RED) {z->_parent->_col = BLACK;u->_col = BLACK;g->_col = RED;z = g;} else {if (z == z->_parent->_left) {z = z->_parent;RotateR(z);}z->_parent->_col = BLACK;g->_col = RED;RotateL(g);}}if (z == _root) break;}_root->_col = BLACK; // 强制根节点为黑[4,8]}
};// 测试用例
int main() {RBTree<int, int> tree;// 测试插入序列(触发所有修复情况)int arr[] = {10, 20, 30, 40, 50, 60, 70, 80, 90};for (auto num : arr) {tree.Insert(make_pair(num, num));}return 0;
}

八、应用场景

  1. C++ STLmap/set底层实现
  2. Java集合TreeMap的平衡机制
  3. Linux内核:进程调度CFS算法
http://www.dtcms.com/a/514853.html

相关文章:

  • 深圳 网站开发百一度一下你就知道
  • 网站建设服务商做博物馆网站最重要性
  • 新昌网站开发个人博客网页设计html模板
  • 保定php网站制作如何让网站给百度收录
  • 网站 搜索引擎 提交中国建筑网官网图片
  • 上海建筑设计研究院有限公司企业seo网络营销
  • 茂名优化网站建设贷款网站建设
  • 新品发布会主题大全南京网络推广优化哪家好
  • 读后感页面设计模板哈尔滨关键词优化价格
  • wordpress首页模板修改那个文件网络舆情优化公司
  • 微信网站开发软件手机开发小程序
  • 用户中心网站设计基于wordpress 开发
  • 优质手机网站建设哪家好山西seo网站设计
  • 有没有专门做飞卢小说盗版的网站网站备案多少钱
  • 武昌网站建设怎么在微信上卖东西
  • 网站高端定制课外辅导东莞网站建设技术支持
  • 合肥建筑网站营销方案策划书怎么写
  • 专业合肥网站建设东营网站建设教程
  • 谁做彩票网站代理建网站的公司排名
  • 注册一个公司网站的费用wordpress棋牌
  • 贴吧网站开发需求分析新开传奇网站发布网单
  • 网站布局怎么做富阳网站建设洛洛科技
  • 在工商局网站怎么做清算app市场分析
  • 土木毕业设计代做网站什么网站可以做市场分析呢
  • 小企业门户网站建设网站开发的基本过程
  • 微网站平台微网站建设方案网络优化工程师
  • 软件下载网站如何履行网站建设要学习什么
  • 微信商城网站凡科网下载
  • 网站地址栏图标怎么做平面设计主要做什么内容
  • 湖北洲天建设集团有限公司网站九牧全球市场地位