您的位置:首页 > 新闻 > 热点要闻 > 软件项目外包平台_网页设计书籍推荐_项链seo关键词_怎样在百度做广告宣传

软件项目外包平台_网页设计书籍推荐_项链seo关键词_怎样在百度做广告宣传

2025/6/4 0:53:43 来源:https://blog.csdn.net/sunshinecandy/article/details/146560291  浏览:    关键词:软件项目外包平台_网页设计书籍推荐_项链seo关键词_怎样在百度做广告宣传
软件项目外包平台_网页设计书籍推荐_项链seo关键词_怎样在百度做广告宣传

文章目录

  • 高级数据结构\RB树
    • 1整体结构
    • 2算法示例
    • 3.代码实现
    • 4.代码说明

高级数据结构\RB树

1整体结构

在这里插入图片描述

2算法示例

3.代码实现

实现红黑树(Red-Black Tree)需要遵循其特定的性质和操作规则。以下是C++实现红黑树的完整代码,包括插入操作和相关的旋转及颜色调整逻辑:红黑树的性质

  1. 每个节点是红色或黑色。
  2. 根节点是黑色。
  3. 所有叶子节点(空节点)是黑色。
  4. 如果一个节点是红色,则它的两个子节点都是黑色(不能有两个连续的红色节点)。
  5. 从任意节点到其每个叶子的所有路径都包含相同数量的黑色节点。
#include <iostream>
using namespace std;template <typename T>
class RBTree {
public:RBTree() : _root(nullptr) {}void insert(const T& val) {_root = _insert(_root, val);_root->_isRed = false; // 根节点必须是黑色}void inorder() {_inorder(_root);cout << endl;}private:struct RBNode {T _data;RBNode* _left;RBNode* _right;bool _isRed; // 红色为true,黑色为falseRBNode(const T& data) : _data(data), _left(nullptr), _right(nullptr), _isRed(true) {}};RBNode* _root;// 插入辅助函数RBNode* _insert(RBNode* node, const T& val) {if (node == nullptr) {return new RBNode(val);}if (val < node->_data) {node->_left = _insert(node->_left, val);} else if (val > node->_data) {node->_right = _insert(node->_right, val);} else {return node; // 不允许插入重复值}// 修复红黑树的性质if (isRed(node->_right) && !isRed(node->_left)) {node = rotateLeft(node);}if (isRed(node->_left) && isRed(node->_left->_left)) {node = rotateRight(node);}if (isRed(node->_left) && isRed(node->_right)) {flipColors(node);}return node;}// 左旋操作RBNode* rotateLeft(RBNode* node) {RBNode* x = node->_right;node->_right = x->_left;x->_left = node;x->_isRed = node->_isRed;node->_isRed = true;return x;}// 右旋操作RBNode* rotateRight(RBNode* node) {RBNode* x = node->_left;node->_left = x->_right;x->_right = node;x->_isRed = node->_isRed;node->_isRed = true;return x;}// 颜色翻转void flipColors(RBNode* node) {node->_isRed = true;node->_left->_isRed = false;node->_right->_isRed = false;}// 判断节点是否为红色bool isRed(RBNode* node) {return node != nullptr && node->_isRed;}// 中序遍历辅助函数void _inorder(RBNode* node) {if (node == nullptr) {return;}_inorder(node->_left);cout << node->_data << " ";_inorder(node->_right);}
};int main() {RBTree<int> tree;tree.insert(10);tree.insert(20);tree.insert(30);tree.insert(40);tree.insert(50);tree.insert(25);cout << "Inorder traversal of the constructed Red-Black Tree is \n";tree.inorder();return 0;
}

4.代码说明

  1. 节点结构:• 每个节点包含数据、左右子节点指针和颜色标志(红色为 true ,黑色为 false )。• 新插入的节点默认为红色。
  2. 插入操作:• 使用递归的方式将新值插入到合适的位置。• 插入后,通过左旋、右旋和颜色翻转操作来修复红黑树的性质。
  3. 左旋和右旋操作:• 左旋和右旋是调整树结构的关键操作,用于保持红黑树的平衡。
  4. 颜色翻转:• 当一个节点的两个子节点都是红色时,将它们的颜色翻转为黑色,并将当前节点的颜色变为红色。
  5. 中序遍历:• 使用递归的方式进行中序遍历,输出树中的所有节点。
    测试在 main 函数中,插入了一些节点并进行了中序遍历,可以用来验证红黑树的正确性。你可以根据需要进一步扩展代码,例如添加删除操作、查找操作等。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com