#include <iostream>
#define NULLVAL -1
using namespace std;
bool BLACK = true;
bool RED = false;
class RBTree {
public:
RBTree* left;
RBTree* right;
float val;
bool color;
RBTree* parent;
RBTree() {
left = NULL;
right = NULL;
val = NULLVAL;
color = BLACK;
parent = NULL;
}
};
//添加子树
void setChildTree(RBTree* &node, char direct, float value, bool color) {
if (node == NULL) return;
RBTree* child = new RBTree();
child->parent = node;
child->color = color;
child->val = value;
if(direct == 'r') node->right = child;
else node->left = child;
}
//查询一个节点的父节点
RBTree* ParentOf(RBTree* node) {
return (node == NULL) ? NULL : node->parent;
}
//查询一个节点的叔叔节点
RBTree* UncleOf(RBTree* node) {
//先找到该节点的爷爷节点
//然后判断该节点的父节点是爷爷节点的左子树还是右子树
RBTree* father = ParentOf(node);
RBTree* grand = ParentOf(father);
if (grand == NULL) return NULL;
if (father == grand->left) {
return (grand->right == NULL) ? NULL : grand->right;
} else if (father == grand->right){
return (grand->left == NULL) ? NULL : grand->left;
} else {
return NULL;
}
}
//更改节点颜色
void SetColor(RBTree* node, bool color) {
node->color = color;
}
//查询一个节点的左子节点
RBTree* LeftChildOf(RBTree* node) {
if(node == NULL) return NULL;
return node->left;
}
//查询一个节点的右子节点
RBTree* RightChildOf(RBTree* node) {
if(node == NULL) return NULL;
return node->right;
}
//节点的左旋
void LeftRotation(RBTree* &root, RBTree* node) {
if(node == NULL) return;
if(node->right == NULL) return;
RBTree* father = node->parent;
RBTree* nodeRight = node->right;
//处理nodeRight的左子树
if (nodeRight->left == NULL) {
node->right = NULL;
} else {
node->right = nodeRight->left;
nodeRight->left->parent = node;
}
//处理node的原来的父节点
if(father == NULL) {
nodeRight->parent = NULL;
root = nodeRight;
} else {
nodeRight->parent = father;
if(father->left == node) {
father->left = nodeRight;
} else {
father->right = nodeRight;
}
}
//处理nodeRight新的左子树
nodeRight->left = node;
node->parent = nodeRight;
}
//节点的右旋
void RightRotation(RBTree* &root, RBTree* node) {
if(node == NULL) return;
if(node->left == NULL) return;
RBTree* father = node->parent;
RBTree* nodeLeft = node->left;
//处理nodeLeft的右子树
if(nodeLeft->right == NULL) {
node->left = NULL
} else {
node->left = nodeLeft->right;
nodeLeft->right->parent = node;
}
//处理father和nodeLeft的关系
if(father == NULL) {
nodeLeft->parent = NULL;
root = nodeLeft;
} else {
nodeLeft->parent = father;
if(father->left == node) {
father->left = nodeLeft;
} else {
father->right = nodeLeft;
}
}
//处理node和nodeLeft的关系
node->parent = nodeLeft;
nodeLeft->right = node;
}
void InOrder(RBTree* root) {
if(root != NULL) {
InOrder(root->left);
cout << "输出根节点: " << root->val << endl;
InOrder(root->right);
}
}
int main() {
RBTree* root = new RBTree();
root->val = 10; //根节点数据为10
setChildTree(root, 'l', 9, BLACK);
setChildTree(root, 'r', 11, BLACK);
setChildTree(root->left, 'l', 8, BLACK);
setChildTree(root->left, 'r', 9.5, BLACK);
setChildTree(root->right, 'l', 10.5, BLACK);
setChildTree(root->right, 'r', 12, BLACK);
setChildTree(root->left->left, 'l', 7.5, BLACK);
setChildTree(root->left->left, 'r', 8.5, BLACK);
setChildTree(root->left->right, 'l', 9.25, BLACK);
setChildTree(root->left->right, 'r', 9.75, BLACK);
setChildTree(root->right->right, 'l', 11.5, BLACK);
setChildTree(root->right->right, 'r', 12.5, BLACK);
return 0;
}
二叉树的左旋和右旋
最新推荐文章于 2025-04-10 14:08:37 发布