当前位置:   article > 正文

红黑树定义及其代码实现_红黑树代码

红黑树代码

一、红黑树定义


红黑树是一种自平衡二叉查找树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是红色或黑色。通过对任何一条从根到叶子节点的路径上各个节点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出两倍,因此,红黑树是近似平衡的。

红黑树的五个性质:

1. 每个节点要么是红色,要么是黑色。
2. 根节点是黑色的。
3. 每个叶子节点(NIL节点,空节点)是黑色的。
4. 如果一个节点是红色的,则它的两个子节点都是黑色的。
5. 对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数目的黑色节点。

红黑树的代码实现可以分为以下几个部分:

1. 定义节点结构体

  1. struct Node {
  2.     int val;
  3.     bool color;
  4.     Node *left, *right, *parent;
  5.     Node(int val) : val(val), color(RED), left(nullptr), right(nullptr), parent(nullptr) {}
  6. };


```

2. 定义红黑树类

  1. class RedBlackTree {
  2. private:
  3.     Node *root;
  4.     void leftRotate(Node *x);
  5.     void rightRotate(Node *y);
  6.     void insertFixup(Node *z);
  7.     void transplant(Node *u, Node *v);
  8.     void deleteFixup(Node *x);
  9.     Node *minimum(Node *x);
  10. public:
  11.     RedBlackTree() : root(nullptr) {}
  12.     void insert(int val);
  13.     void remove(int val);
  14.     bool search(int val);
  15. };


 

3. 实现插入操作

  1. void RedBlackTree::insert(int val) {
  2.     Node *z = new Node(val);
  3.     Node *y = nullptr;
  4.     Node *x = root;
  5.     while (x != nullptr) {
  6.         y = x;
  7.         if (z->val < x->val) {
  8.             x = x->left;
  9.         } else {
  10.             x = x->right;
  11.         }
  12.     }
  13.     z->parent = y;
  14.     if (y == nullptr) {
  15.         root = z;
  16.     } else if (z->val < y->val) {
  17.         y->left = z;
  18.     } else {
  19.         y->right = z;
  20.     }
  21.     z->left = nullptr;
  22.     z->right = nullptr;
  23.     z->color = RED;
  24.     insertFixup(z);
  25. }

4. 实现插入操作的修复函数

  1. void RedBlackTree::insertFixup(Node *z) {
  2.     while (z->parent != nullptr && z->parent->color == RED) {
  3.         if (z->parent == z->parent->parent->left) {
  4.             Node *y = z->parent->parent->right;
  5.             if (y != nullptr && y->color == RED) {
  6.                 z->parent->color = BLACK;
  7.                 y->color = BLACK;
  8.                 z->parent->parent->color = RED;
  9.                 z = z->parent->parent;
  10.             } else {
  11.                 if (z == z->parent->right) {
  12.                     z = z->parent;
  13.                     leftRotate(z);
  14.                 }
  15.                 z->parent->color = BLACK;
  16.                 z->parent->parent->color = RED;
  17.                 rightRotate(z->parent->parent);
  18.             }
  19.         } else {
  20.             Node *y = z->parent->parent->left;
  21.             if (y != nullptr && y->color == RED) {
  22.                 z->parent->color = BLACK;
  23.                 y->color = BLACK;
  24.                 z->parent->parent->color = RED;
  25.                 z = z->parent->parent;
  26.             } else {
  27.                 if (z == z->parent->left) {
  28.                     z = z->parent;
  29.                     rightRotate(z);
  30.                 }
  31.                 z->parent->color = BLACK;
  32.                 z->parent->parent->color = RED;
  33.                 leftRotate(z->parent->parent);
  34.             }
  35.         }
  36.     }
  37.     root->color = BLACK;
  38. }

5. 实现左旋和右旋操作

  1. void RedBlackTree::leftRotate(Node *x) {
  2.     Node *y = x->right;
  3.     x->right = y->left;
  4.     if (y->left != nullptr) {
  5.         y->left->parent = x;
  6.     }
  7.     y->parent = x->parent;
  8.     if (x->parent == nullptr) {
  9.         root = y;
  10.     } else if (x == x->parent->left) {
  11.         x->parent->left = y;
  12.     } else {
  13.         x->parent->right = y;
  14.     }
  15.     y->left = x;
  16.     x->parent = y;
  17. }
  18. void RedBlackTree::rightRotate(Node *y) {
  19.     Node *x = y->left;
  20.     y->left = x->right;
  21.     if (x->right != nullptr) {
  22.         x->right->parent = y;
  23.     }
  24.     x->parent = y->parent;
  25.     if (y->parent == nullptr) {
  26.         root = x;
  27.     } else if (y == y->parent->left) {
  28.         y->parent->left = x;
  29.     } else {
  30.         y->parent->right = x;
  31.     }
  32.     x->right = y;
  33.     y->parent = x;
  34. }

6. 实现删除操作

  1. void RedBlackTree::remove(int val) {
  2.     Node *z = root;
  3.     while (z != nullptr) {
  4.         if (val == z->val) {
  5.             break;
  6.         } else if (val < z->val) {
  7.             z = z->left;
  8.         } else {
  9.             z = z->right;
  10.         }
  11.     }
  12.     if (z == nullptr) {
  13.         return;
  14.     }
  15.     Node *x, *y = z;
  16.     bool y_original_color = y->color;
  17.     if (z->left == nullptr) {
  18.         x = z->right;
  19.         transplant(z, z->right);
  20.     } else if (z->right == nullptr) {
  21.         x = z->left;
  22.         transplant(z, z->left);
  23.     } else {
  24.         y = minimum(z->right);
  25.         y_original_color = y->color;
  26.         x = y->right;
  27.         if (y->parent == z) {
  28.             x->parent = y;
  29.         } else {
  30.             transplant(y, y->right);
  31.             y->right = z->right;
  32.             y->right->parent = y;
  33.         }
  34.         transplant(z, y);
  35.         y->left = z->left;
  36.         y->left->parent = y;
  37.         y->color = z->color;
  38.     }
  39.     if (y_original_color == BLACK) {
  40.         deleteFixup(x);
  41.     }
  42. }
  43. void RedBlackTree::transplant(Node *u, Node *v) {
  44.     if (u->parent == nullptr) {
  45.         root = v;
  46.     } else if (u == u->parent->left) {
  47.         u->parent->left = v;
  48.     } else {
  49.         u->parent->right = v;
  50.     }
  51.     if (v != nullptr) {
  52.         v->parent = u->parent;
  53.     }
  54. }
  55. void RedBlackTree::deleteFixup(Node *x) {
  56.     while (x != root && x->color == BLACK) {
  57.         if (x == x->parent->left) {
  58.             Node *w = x->parent->right;
  59.             if (w->color == RED) {
  60.                 w->color = BLACK;
  61.                 x->parent->color = RED;
  62.                 leftRotate(x->parent);
  63.                 w = x->parent->right;
  64.             }
  65.             if (w->left->color == BLACK && w->right->color == BLACK) {
  66.                 w->color = RED;
  67.                 x = x->parent;
  68.             } else {
  69.                 if (w->right->color == BLACK) {
  70.                     w->left->color = BLACK;
  71.                     w->color = RED;
  72.                     rightRotate(w);
  73.                     w = x->parent->right;
  74.                 }
  75.                 w->color = x->parent->color;
  76.                 x->parent->color = BLACK;
  77.                 w->right->color = BLACK;
  78.                 leftRotate(x->parent);
  79.                 x = root;
  80.             }
  81.         } else {
  82.             Node *w = x->parent->left;
  83.             if (w->color == RED) {
  84.                 w->color = BLACK;
  85.                 x->parent->color = RED;
  86.                 rightRotate(x->parent);
  87.                 w = x->parent->left;
  88.             }
  89.             if (w->right->color == BLACK && w->left->color == BLACK) {
  90.                 w->color = RED;
  91.                 x = x->parent;
  92.             } else {
  93.                 if (w->left->color == BLACK) {
  94.                     w->right->color = BLACK;
  95.                     w->color = RED;
  96.                     leftRotate(w);
  97.                     w = x->parent->left;
  98.                 }
  99.                 w->color = x->parent->color;
  100.                 x->parent->color = BLACK;
  101.                 w->left->color = BLACK;
  102.                 rightRotate(x->parent);
  103.                 x = root;
  104.             }
  105.         }
  106.     }
  107.     x->color = BLACK;
  108. }
  109. Node *RedBlackTree::minimum(Node *x) {
  110.     while (x->left != nullptr) {
  111.         x = x->left;
  112.     }
  113.     return x;
  114. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/451494
推荐阅读
相关标签
  

闽ICP备14008679号