算法导论中红黑树的C++实现

来源:互联网 发布:xshell mac 编辑:程序博客网 时间:2024/04/29 13:26

1、头文件 RBTree.h

  1. #ifndef RBTREE__JOHN__DMRC
  2. #define RBTREE__JOHN__DMRC
  3. /********************   Class Node   **********************/
  4. template <typename T>
  5. class Node{
  6. public:
  7.     Node() : red(false), exist(false), left(NULL), right(NULL), parent(NULL){}
  8.     Node(T &t) : data(t), red(true), exist(true), left(NULL), right(NULL), parent(NULL){}
  9.     //function
  10.     // max & min
  11.     Node<T>* maximum();
  12.     Node<T>* minimum();
  13.     // successor & predecessor
  14.     Node<T>* successor();
  15.     Node<T>* predecessor();
  16.     // exist
  17.     bool isExist() { return this ->exist; }
  18.     bool isNULL() { return !this ->exist; }
  19.     // red & black ( black = 0 & red = 1 )
  20.     bool getColor() { return this ->red; }
  21.     bool isRed(){ return this ->red; }
  22.     bool isBlack() { return !this ->red; }
  23.     void setColor(bool c) { this ->red = c; }
  24.     void setRed() { this ->red = true; }
  25.     void setBlack() { this ->red = false; }
  26.     //varables
  27.     T data;
  28.     bool red;
  29.     bool exist;
  30.     Node<T>* left;
  31.     Node<T>* right;
  32.     Node<T>* parent;
  33. };
  34. /********************   Class RBTree   ********************/
  35. template <typename T, typename E>
  36. class RBTree{
  37. public:
  38.     RBTree() : root(NULL){}
  39.     ~RBTree();
  40.     bool Insert(T &);
  41.     bool Delete(T &, E);
  42.     // debug
  43.     T get_head(){ return root ->data;}
  44. private:
  45.     // delete_tree;
  46.     void delete_tree(Node<T>*);
  47.     // delete a node;
  48.     bool delete_node(T&, Node<T>*);
  49.     // rotates
  50.     void left_rotate(Node<T>*);
  51.     void right_rotate(Node<T>*);
  52.     // fixups
  53.     void insert_fixup(Node<T>*);
  54.     void delete_fixup(Node<T>*);
  55.     Node<T>* root;
  56. };
  57. #endif

2、实现 RBTree.cpp

  1. #include "RBTree.h"
  2. /********************   Class Node   **********************/
  3. template <typename T>
  4. Node<T>* Node<T>::maximum(){
  5.     Node<T>* x = this;
  6.     while(x ->right ->isExist())
  7.         x = x ->right;
  8.     return x;
  9. }
  10. template <typename T>
  11. Node<T>* Node<T>::minimum(){
  12.     Node<T>* x = this;
  13.     while(x ->left ->isExist())
  14.         x = x ->left;
  15.     return x;
  16. }
  17. template <typename T>
  18. Node<T>* Node<T>::successor(){
  19.     Node<T>* y;
  20.     Node<T>* x;
  21.     if(this ->right ->isExist())
  22.         return this ->right ->minimum();
  23.     x = this;
  24.     y = x ->parent;
  25.     while(y != NULL && x == y ->right){
  26.         x = y;
  27.         y = x ->parent;
  28.     }
  29.     return y;
  30. }
  31. template <typename T>
  32. Node<T>* Node<T>::predecessor(){
  33.     Node<T>* y;
  34.     Node<T>* x;
  35.     if(this ->left ->isExist())
  36.         return this ->left ->maximum();
  37.     x = this;
  38.     y = x ->parent;
  39.     while(y != NULL && x == y ->left){
  40.         x = y;
  41.         y = x ->parent;
  42.     }
  43.     return y;
  44. }
  45. /*******************   Class RBTree   *********************/
  46. template <typename T, typename E>
  47. RBTree<T, E>::~RBTree(){
  48.     this ->delete_tree(this ->root);
  49. }
  50. template <typename T, typename E>
  51. void RBTree<T, E>::delete_tree(Node<T>* p){
  52.     if(p){
  53.         if(p ->left)
  54.             this ->delete_tree(p ->left);
  55.         if(p ->right)
  56.             this ->delete_tree(p ->right);
  57.         delete p;
  58.     }
  59. }
  60. // Insert & fixup
  61. template <typename T, typename E>
  62. bool RBTree<T, E>::Insert(T &t){
  63.     if(this ->root == NULL || this ->root ->isNULL()){
  64.         if(this ->root)
  65.             delete this ->root;
  66.         this ->root = new Node<T>(t);
  67.         this ->root ->left = new Node<T>();
  68.         this ->root ->left ->parent = this ->root;
  69.         this ->root ->right = new Node<T>();
  70.         this ->root ->right ->parent = this ->root;
  71.         this ->root ->setBlack();
  72.         return true;
  73.     }
  74.     Node<T>* p = this ->root;
  75.     while(1){
  76.         if(t == p ->data)
  77.             return false;
  78.         if(t < p ->data){
  79.             if(p ->left ->isNULL()){
  80.                 delete p ->left;
  81.                 p ->left = new Node<T>(t);
  82.                 p ->left ->parent = p;
  83.                 p ->left ->left = new Node<T>();
  84.                 p ->left ->left ->parent = p ->left;
  85.                 p ->left ->right = new Node<T>();
  86.                 p ->left ->right ->parent = p ->left;
  87.                 this ->insert_fixup(p ->left);
  88.                 return true;
  89.             }
  90.             else
  91.                 p = p ->left;
  92.         }
  93.         else{
  94.             if(p ->right ->isNULL()){
  95.                 delete p ->right;
  96.                 p ->right = new Node<T>(t);
  97.                 p ->right ->parent = p;
  98.                 p ->right ->left = new Node<T>();
  99.                 p ->right ->left ->parent = p ->left;
  100.                 p ->right ->right = new Node<T>();
  101.                 p ->right ->right ->parent = p ->left;
  102.                 this ->insert_fixup(p ->right);
  103.                 return true;
  104.             }
  105.             else
  106.                 p = p ->right;
  107.         }
  108.     }
  109.     return false;
  110. }
  111. template <typename T, typename E>
  112. void RBTree<T, E>::insert_fixup(Node<T>* z){
  113.     Node<T>* y;
  114.     while(z ->parent && z ->parent ->isRed()){
  115.         if(z ->parent == z ->parent ->parent ->left){
  116.             y = z ->parent ->parent ->right;
  117.             if(y ->isRed()){
  118.                 //case 1
  119.                 z ->parent ->setBlack();
  120.                 y ->setBlack();
  121.                 z ->parent ->parent ->setRed();
  122.                 z = z ->parent ->parent;
  123.             }
  124.             else
  125.                 if(z == z ->parent ->right){
  126.                     // case 2 ( fall through to case 3 )
  127.                     z = z ->parent;
  128.                     this ->left_rotate(z);
  129.                 }
  130.                 // case 3
  131.                 z ->parent ->setBlack();
  132.                 z ->parent ->parent ->setRed();
  133.                 this ->right_rotate(z ->parent ->parent);
  134.             }
  135.         }
  136.         else{
  137.             y = z ->parent ->parent ->left;
  138.             if(y ->isRed()){
  139.                 // case 4
  140.                 z ->parent ->setBlack();
  141.                 y ->setBlack();
  142.                 z ->parent ->parent ->setRed();
  143.                 z = z ->parent ->parent;
  144.             }
  145.             else
  146.                 if(z == z ->parent ->left){
  147.                     // case 5 ( fall through to case 6 )
  148.                     z = z ->parent;
  149.                     this ->right_rotate(z);
  150.                 }
  151.                 // case 6
  152.                 z ->parent ->setBlack();
  153.                 z ->parent ->parent ->setRed();
  154.                 this ->left_rotate(z ->parent ->parent);
  155.             }
  156.         }
  157.     }
  158.     this ->root ->setBlack();
  159. }
  160. // delete & fixup
  161. template <typename T, typename E>
  162. bool RBTree<T, E>::Delete(T &t, E e){
  163.     Node<T>* p = this ->root;
  164.     while(p ->isExist()){
  165.         if(p ->data == e)
  166.             return this ->delete_node(t, p);
  167.         else if(e < p ->data)
  168.             p = p ->left;
  169.         else
  170.             p = p ->right;
  171.     }
  172.     return false;
  173. }
  174. template <typename T, typename E>
  175. bool RBTree<T, E>::delete_node(T& t, Node<T>* z){
  176.     Node<T>* y;
  177.     Node<T>* x;
  178.     if(z ->left ->isNULL() || z ->right ->isNULL())
  179.         y = z;
  180.     else
  181.         y = z ->successor();
  182.     if(y ->left ->isExist()){
  183.         x = y ->left;
  184.         if(y ->right ->isNULL())
  185.             delete y ->right;
  186.     }
  187.     else{
  188.         x = y ->right;
  189.         if(y ->left ->isNULL())
  190.             delete y ->left;
  191.     }
  192.     x ->parent = y ->parent;
  193.     if(y ->parent == NULL)
  194.         this ->root = x;
  195.     else if(y == y ->parent ->left)
  196.         y ->parent ->left = x;
  197.     else
  198.         y ->parent ->right = x;
  199.     if(y != z){
  200.         T temp = z ->data;
  201.         z ->data = y ->data;
  202.         y ->data = temp;
  203.     }
  204.     if(y ->isBlack())
  205.         this ->delete_fixup(x);
  206.     t = y ->data;
  207.     delete y;
  208.     return true;
  209. }
  210. template <typename T, typename E>
  211. void RBTree<T, E>::delete_fixup(Node<T>* x){
  212.     Node<T>* w;
  213.     while(x != this ->root && x ->isBlack()){
  214.         if(x == x ->parent ->left){
  215.             w = x ->parent ->right;
  216.             if(w ->isRed()){
  217.                 // case 1 ( fall through )
  218.                 w ->setBlack();
  219.                 x ->parent ->setRed();
  220.                 this ->left_rotate(x ->parent);
  221.                 w = x ->parent ->right;
  222.             }
  223.             if(w ->left ->isBlack() && w ->right ->isBlack()){
  224.                 // case 2 ( new circle with x's value changed )
  225.                 w ->setRed();
  226.                 x = x ->parent;
  227.             }
  228.             else{
  229.                 if(w ->right ->isBlack()){
  230.                     // case 3 ( fall through to case 4 )
  231.                     w ->left ->setBlack();
  232.                     w ->setRed();
  233.                     this ->right_rotate(w);
  234.                     w = x ->parent ->right;
  235.                 }
  236.                 // case 4 ( exit the while with x = root )
  237.                 w ->setColor(x ->parent ->getColor());
  238.                 x ->parent ->setBlack();
  239.                 w ->right ->setBlack();
  240.                 this ->left_rotate(x ->parent);
  241.                 x = this ->root;
  242.             }
  243.         }
  244.         else{
  245.             w = x ->parent ->left;
  246.             if(w ->isRed()){
  247.                 // case 5 ( fall through )
  248.                 w ->setBlack();
  249.                 x ->parent ->setRed();
  250.                 this ->right_rotate(x ->parent);
  251.                 w = x ->parent ->left;
  252.             }
  253.             if(w ->left ->isBlack() && w ->right ->isBlack()){
  254.                 // case 6 ( new circle with x's value changed )
  255.                 w ->setRed();
  256.                 x = x ->parent;
  257.             }
  258.             else
  259.                 if(w ->left ->isBlack()){
  260.                     // case 7 ( fall through to case 8 )
  261.                     w ->right ->setBlack();
  262.                     w ->setRed();
  263.                     this ->left_rotate(w);
  264.                     w = x ->parent ->left;
  265.                 }
  266.                 // case 8 ( exit the while with x = root)
  267.                 w ->setColor(x ->parent ->getColor());
  268.                 x ->parent ->setBlack();
  269.                 w ->left ->setBlack();
  270.                 this ->right_rotate(x ->parent);
  271.                 x = this ->root;
  272.             }
  273.         }
  274.     }
  275.     x ->setBlack();
  276. }
  277. // rotate
  278. template <typename T, typename E>
  279. void RBTree<T, E>::left_rotate(Node<T>* x){
  280.     Node<T>* y = x ->right;
  281.     // set beta
  282.     x ->right = y ->left;
  283.     if(y ->left)
  284.         y ->left ->parent = x;
  285.     // set parent
  286.     y ->parent = x ->parent;
  287.     if(x ->parent == NULL)
  288.         this ->root = y;
  289.     else{
  290.         if(x == x ->parent ->left)
  291.             x ->parent ->left = y;
  292.         else
  293.             x ->parent ->right = y;
  294.     }
  295.     // set relation
  296.     y ->left = x;
  297.     x ->parent = y;
  298. }
  299. template <typename T, typename E>
  300. void RBTree<T, E>::right_rotate(Node<T>* x){
  301.     Node<T>* y = x ->left;
  302.     // set beta
  303.     x ->left = y ->right;
  304.     if(y ->right)
  305.         y ->right ->parent = x;
  306.     // set parent
  307.     y ->parent = x ->parent;
  308.     if(x ->parent == NULL)
  309.         this ->root = y;
  310.     else{
  311.         if(x == x ->parent ->left)
  312.             x ->parent ->left = y;
  313.         else
  314.             x ->parent ->right = y;
  315.     }
  316.     // set relation
  317.     y ->right = x;
  318.     x ->parent = y;
  319. }

 

3、简单的应用 main.cpp

 

  1. #include <iostream>
  2. #include <string>
  3. template<typename T, typename E> class RBTree;
  4. using namespace std;
  5. int main(void){
  6.     RBTree<intint> s;
  7.     int i, a[10] = { 1, 2, 3, 4, 6, 8, 0, 7, 5, 9};
  8.     for(i = 0; i < 10; i ++){
  9.         s.Insert(a[i]);
  10.         cout << s.get_head() << endl;
  11.     }
  12.     return 0;
  13. }
原创粉丝点击