文章目录
高级数据结构\RB树
1整体结构
2算法示例
3.代码实现
实现红黑树(Red-Black Tree)需要遵循其特定的性质和操作规则。以下是C++实现红黑树的完整代码,包括插入操作和相关的旋转及颜色调整逻辑:红黑树的性质
- 每个节点是红色或黑色。
- 根节点是黑色。
- 所有叶子节点(空节点)是黑色。
- 如果一个节点是红色,则它的两个子节点都是黑色(不能有两个连续的红色节点)。
- 从任意节点到其每个叶子的所有路径都包含相同数量的黑色节点。
#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,黑色为false
RBNode(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.代码说明
- 节点结构:• 每个节点包含数据、左右子节点指针和颜色标志(红色为 true ,黑色为 false )。• 新插入的节点默认为红色。
- 插入操作:• 使用递归的方式将新值插入到合适的位置。• 插入后,通过左旋、右旋和颜色翻转操作来修复红黑树的性质。
- 左旋和右旋操作:• 左旋和右旋是调整树结构的关键操作,用于保持红黑树的平衡。
- 颜色翻转:• 当一个节点的两个子节点都是红色时,将它们的颜色翻转为黑色,并将当前节点的颜色变为红色。
- 中序遍历:• 使用递归的方式进行中序遍历,输出树中的所有节点。
测试在 main 函数中,插入了一些节点并进行了中序遍历,可以用来验证红黑树的正确性。你可以根据需要进一步扩展代码,例如添加删除操作、查找操作等。