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

网上美工培训seo综合查询系统

网上美工培训,seo综合查询系统,惠州品牌网站建设价格,钦州网站建设红黑树(Red - Black Tree) 1.定义 红黑树是一种自平衡的二叉查找树,它在每一个节点上增加另一个存储位来表示节点的颜色,可以是红色或者黑色。通过这些颜色的约束,红黑树能够保证从根到叶子节点的最长路径不会超过最…

红黑树(Red - Black Tree)

1.定义

红黑树是一种自平衡的二叉查找树,它在每一个节点上增加另一个存储位来表示节点的颜色,可以是红色或者黑色。通过这些颜色的约束,红黑树能够保证从根到叶子节点的最长路径不会超过最短路径的两倍,从而保持大致的平衡。

2.性质

1.节点是红色或者黑色。

2.根节点是黑色。

3.叶子节点(空节点)是黑色。

4.如果一个节点是红色,则它的两个子节点都是黑色。(不能有两个连续的红色节点)

5.从任意节点到其每个叶子的所有路径都包含相同数量的黑色节点。

以下是红黑树的简单实现代码(仅包含插入操作):

#include <iostream>
#include<vector>
#include <stdio.h>
#include <stdlib.h>
using namespace std;// 定义节点颜色
typedef enum { RED, BLACK } Color;// 定义红黑树节点
typedef struct RBTreeNode {int key;Color color;struct RBTreeNode* left;struct RBTreeNode* right;struct RBTreeNode* parent;
} RBTreeNode;// 创建新节点
RBTreeNode* createNode(int key) {RBTreeNode* newNode = (RBTreeNode*)malloc(sizeof(RBTreeNode));newNode->key = key;newNode->color = RED; // 新节点默认为红色newNode->left = NULL;newNode->right = NULL;newNode->parent = NULL;return newNode;
}// 左旋操作
void leftRotate(RBTreeNode** root, RBTreeNode* x) {RBTreeNode* y = x->right; // 设置yx->right = y->left; // 转移y的左子树到x的右子树if (y->left != NULL) {y->left->parent = x;}y->parent = x->parent; // 链接x的父节点到yif (x->parent == NULL) {*root = y;}else if (x == x->parent->left) {x->parent->left = y;}else {x->parent->right = y;}y->left = x; // 把x放到y的左子树x->parent = y;
}// 右旋操作
void rightRotate(RBTreeNode** root, RBTreeNode* y) {RBTreeNode* x = y->left; // 设置xy->left = x->right; // 转移x的右子树到y的左子树if (x->right != NULL) {x->right->parent = y;}x->parent = y->parent; // 链接y的父节点到xif (y->parent == NULL) {*root = x;}else if (y == y->parent->right) {y->parent->right = x;}else {y->parent->left = x;}x->right = y; // 把y放到x的右子树y->parent = x;
}// 修复插入操作后的红黑树性质
void fixInsert(RBTreeNode** root, RBTreeNode* newNode) {RBTreeNode* uncle;while (newNode != *root && newNode->parent->color == RED) {if (newNode->parent == newNode->parent->parent->left) {uncle = newNode->parent->parent->right; // 叔叔节点if (uncle != NULL && uncle->color == RED) {// 情况1:叔叔是红色newNode->parent->color = BLACK;uncle->color = BLACK;newNode->parent->parent->color = RED;newNode = newNode->parent->parent;}else {if (newNode == newNode->parent->right) {// 情况2:叔叔是黑色,且新节点是右孩子newNode = newNode->parent;leftRotate(root, newNode);}// 情况3:叔叔是黑色,且新节点是左孩子newNode->parent->color = BLACK;newNode->parent->parent->color = RED;rightRotate(root, newNode->parent->parent);}}else {uncle = newNode->parent->parent->left; // 叔叔节点if (uncle != NULL && uncle->color == RED) {// 情况1:叔叔是红色newNode->parent->color = BLACK;uncle->color = BLACK;newNode->parent->parent->color = RED;newNode = newNode->parent->parent;}else {if (newNode == newNode->parent->left) {// 情况2:叔叔是黑色,且新节点是左孩子newNode = newNode->parent;rightRotate(root, newNode);}// 情况3:叔叔是黑色,且新节点是右孩子newNode->parent->color = BLACK;newNode->parent->parent->color = RED;leftRotate(root, newNode->parent->parent);}}}(*root)->color = BLACK; // 根节点必须是黑色
}// 插入新节点
void insert(RBTreeNode** root, int key) {RBTreeNode* newNode = createNode(key);RBTreeNode* current = *root;RBTreeNode* parent = NULL;// 查找插入位置while (current != NULL) {parent = current;if (newNode->key < current->key) {current = current->left;}else {current = current->right;}}newNode->parent = parent; // 设置父节点if (parent == NULL) {*root = newNode; // 如果树为空,新节点成为根节点}else if (newNode->key < parent->key) {parent->left = newNode; // 插入到父节点的左子树}else {parent->right = newNode; // 插入到父节点的右子树}fixInsert(root, newNode); // 修复红黑树性质
}// 打印红黑树(中序遍历)
void inorderTraversal(RBTreeNode* root) 
{if (root != NULL) {inorderTraversal(root->left);printf("%d(%s) ", root->key, root->color == RED ? "RED" : "BLACK");inorderTraversal(root->right);}
}int main() 
{RBTreeNode* root = NULL;insert(&root, 10);insert(&root, 20);insert(&root, 30);insert(&root, 40);insert(&root, 50);printf("Inorder traversal of the constructed Red - Black Tree is:\n");inorderTraversal(root);printf("\n");return 0;
}

代码运行结果:

微信截图_20250608122112

说明:以上代码来自于Kimi AI助手。

好文链接:

数据结构(8)-- 图解红黑树

【高阶数据结构】红黑树详解

http://www.dtcms.com/wzjs/381354.html

相关文章:

  • 广元市网站建设营销培训总结
  • 政府网站建设怎么做企业培训网
  • 网站建设合同纠纷快速seo优化
  • 58同城佛山网站建设网络推广哪个平台好
  • 北京中交建设公司网站重庆seo排名优化
  • 网站推广究竟应该怎么做seo网站推广教程
  • 彩票网站维护会跑路吗湖南网站seo
  • 全国建筑四库一平台查询个人信息seo的英文全称是什么
  • 网站广告怎么做百度关键词权重查询
  • 物流三方网站怎么做google全球推广
  • 简洁大气网站源码江阴企业网站制作
  • 0基础做下载网站百度论坛
  • 阿里巴巴的网站流程哪家网络公司比较好
  • 大型网站建设报价方案广州百度seo排名优化
  • 徐州网站开发市场新开发的app怎么推广
  • 企业网站前期建设方案案例焊工培训ppt课件
  • 如何自己做公司网站国际新闻最新消息美国
  • 大连城市建设档案馆官方网站seo搜索引擎优化试题
  • 福州专业网站建设服务商启信聚客通网络营销策划
  • 百度显示网站正在建设中yahoo引擎入口
  • 如何做网站规划守游网络推广平台
  • 网站开发管理学什么5g影讯5g天线在线观看免费视频
  • 网站建设一条龙怎么开展网络营销推广
  • html5登录界面完整代码seo优化交流
  • 做网站大概需要几个人南京百度搜索优化
  • 房屋设计装修网站佛山旺道seo优化
  • 大连市城乡建设局网站自己怎么注册网站
  • 什么网站上做指甲最便宜长沙seo网站优化公司
  • 用php做的博客网站seo关键字优化教程
  • 云南旅行社网站建设成都网站优化seo