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

红黑树为满足下列五个条件的特殊二叉树

  1. 每个结点要么是红的要么是黑的。  
  2. 根结点是黑的。  
  3. 每个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。  
  4. 如果一个结点是红的,那么它的两个儿子都是黑的。  
  5.  对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。

本文代码根据算法导论上的伪代码编写,按照先序、中序、后序输出。可直接运行,如有错误,欢迎大家指正~~~

black_red_tree.h:

#ifndef _RB_TREE_H_
#define _RB_TREE_H_
#include <iostream>
#include <sstream>
#include <fstream>
#include <cmath>

using namespace std;
template<class KEY>
class RB_Tree
{
private:

 RB_Tree(const RB_Tree& input){}
 const RB_Tree& operator=(const RB_Tree& input){}
private:
 enum COLOR{RED,BLACK};
 class RB_NODE
 {
 public:
  RB_NODE()
  {
   right=NULL;
   left=NULL;
   parent=NULL;
  }
  COLOR RB_COLOR;
  RB_NODE* right;
  RB_NODE* left;
  RB_NODE* parent;
  KEY key;
 };
 
public:
 RB_NODE* m_nullNode;
 RB_NODE* m_root;
 enum ORDER_MODE
 {
  ORDER_MODE_PREV = 0,
  ORDER_MODE_MID,
  ORDER_MODE_POST
 };//枚举,代表遍历树的方式(前序,中序,后序)
 /*
 1.BlackRedTree的构造,折构,以及判断树是否为空
 */
 RB_Tree()
 {
  this->m_nullNode=new RB_NODE();
  this->m_root=m_nullNode;
  this->m_nullNode->right=this->m_root;
  this->m_nullNode->left=this->m_root;
  this->m_nullNode->parent=this->m_root;
  this->m_nullNode->RB_COLOR=BLACK;
 }
 ~RB_Tree()
 {
  clear(m_root);
  delete m_nullNode;
 }
 bool Empty()
 {
  if (this->m_root==this->m_nullNode)
  {
   return true;
  }
  else
   return false;
 }
 /*
 2.BlackRedTree的搜索
 */
 RB_NODE* find(KEY key)
 {
  RB_NODE* index=m_root;
  while(index!=m_nullNode)
  {
   if (key<index->key)
   {
    index=index->left;
   }
   else if(key>index->key)
   {
    index=index->right;
   }
   else
    break;
  }
  return index;
 }
 /*
 3.BlackRedTree的插入(左旋,右旋,插入,红黑状态更新)
 */
 /*
 3.1左旋
 */
 void RotateLeft(RB_NODE* node)
 {
  if (node==m_nullNode||node->right==m_nullNode)
  {
   return ;
  }
  RB_NODE* lower_right=node->right;
  node->right=lower_right->left;
  if (lower_right->left!=m_nullNode)
  {
   lower_right->left->parent=node;
  }
  lower_right->parent=node->parent;
  if (node->parent==m_nullNode)
  {
   m_root=lower_right;
   m_nullNode->left=m_root;
   m_nullNode->right=m_root;
  }
  else if (node==node->parent->left)
  {
   node->parent->left=lower_right;
  }
  else
   node->parent->right=lower_right;
  lower_right->left=node;
  node->parent=lower_right;
 }
 /*
 3.2右旋
 */
 void RotateRight(RB_NODE* node)
 {
  if (node==m_nullNode||node->left==m_nullNode)
  {
   return ;
  }
  RB_NODE* lower_left=node->left;
  node->left=lower_left->right;
  if (lower_left->right!=m_nullNode)
  {
   lower_left->right->parent=node;
  }
  lower_left->parent=node->parent;
  if (node->parent==m_nullNode)
  {
   m_root=lower_left;
   m_nullNode->left=m_root;
   m_nullNode->right=m_root;
  }
  else if (node==node->parent->right)
  {
   node->parent->right=lower_left;
  }
  else
   node->parent->left=lower_left;
  lower_left->right=node;
  node->parent=lower_left;
 }
 /*
 3.3插入
 */
 void Insert(KEY key)
 {
  RB_NODE* insert_point=m_nullNode;
  RB_NODE* index=m_root;
  while(index!=m_nullNode)
  {
   insert_point=index;
   if (key<index->key)
   {
    index=index->left;
   }
   else if (key>index->key)
   {
    index=index->right;
   }
   else
    return;
  }
  RB_NODE* insert_node=new RB_NODE();
  insert_node->key=key;
  insert_node->RB_COLOR=RED;
  insert_node->right=m_nullNode;
  insert_node->left=m_nullNode;
  insert_node->parent=insert_point;
  if (insert_point==m_nullNode)
  {
   m_root=insert_node;
   m_root->parent=m_nullNode;
   m_nullNode->left=m_root;
   m_nullNode->right=m_root;
   m_nullNode->parent=m_root;
  }
  else if (insert_node->key<insert_point->key)
  {
   insert_point->left=insert_node;
  }
  else
   insert_point->right=insert_node;
  InsertFixUp(insert_node);
 }
 /*
 3.4红黑性质修复
 */
 void InsertFixUp(RB_NODE* node)
 {
  while(node->parent->RB_COLOR==RED)
  {
   if (node->parent==node->parent->parent->left)
   {
    RB_NODE* uncle=node->parent->parent->right;
    if (uncle->RB_COLOR==RED)
    {
     node->parent->RB_COLOR=BLACK;
     uncle->RB_COLOR=BLACK;
     node->parent->parent->RB_COLOR=RED;
     node=node->parent->parent;
    }
    else
    {
      if (node==node->parent->right)
     {
      node=node->parent;
      RotateLeft(node);
     }
       node->parent->RB_COLOR=BLACK;
       node->parent->parent->RB_COLOR=RED;
       RotateRight(node->parent->parent);
    }
   }
   else
   {
    RB_NODE* uncle=node->parent->parent->left;
    if (uncle->RB_COLOR==RED)
    {
     node->parent->RB_COLOR=BLACK;
     uncle->RB_COLOR=BLACK;
     node->parent->parent->RB_COLOR=RED;
     node=node->parent->parent;
    }
    else
    {
     if (node==node->parent->left)
     {
      node=node->parent;
      RotateRight(node);
     }
      node->parent->RB_COLOR=BLACK;
      node->parent->parent->RB_COLOR=RED;
      RotateLeft(node->parent->parent);
    }
   }
  }
  m_root->RB_COLOR=BLACK;
 }
 /*
 4.BlackRedTree的删除(转换子树,找最小值节点,找最大值,删除,红黑状态修复)
 */
 /*
 4.1 转换子树
 */
 void RB_TRANSPLANT(RB_NODE* u,RB_NODE* v)
 {
  if (u->parent==m_nullNode)
  {
   m_root=v;
   m_root->parent=m_nullNode;
   m_nullNode->left=m_root;
   m_nullNode->right=m_root;
   m_nullNode->parent=m_root;
  }
  else if (u==u->parent->left)
  {
   u->parent->left=v;
  }
  else
  {
      u->parent->right=v;
  }
  v->parent=u->parent;
 }
 /*
 4.2 找最小值
 */
    RB_NODE* RB_findMin(RB_NODE* node)
 {
  while(node->left!=m_nullNode)
  {
   node=node->left;
  }
  return node;
 }
 /*
 4.3 找最大值
 */
 RB_NODE* RB_findMax(RB_NODE* node)
 {
  while(node->right!=m_nullNode)
  {
   node=node->right;
  }
  return node;
 }
 /*
 4.4 删除
 */
 bool Delete(KEY key)
 {
  RB_NODE* delete_node=find(key);
  if (delete_node==m_nullNode)
  {
   return false;
  }
  RB_NODE* delete_point=delete_node;
  RB_NODE* delete_point_child;
  COLOR Original_color=delete_point->RB_COLOR;
  if (delete_node->left==m_nullNode)
  {
   delete_point_child=delete_node->right;
   RB_TRANSPLANT(delete_node,delete_node->right);
  }
  else if (delete_node->right==m_nullNode)
  {
   delete_point_child=delete_node->left;
   RB_TRANSPLANT(delete_node,delete_node->left);
  }
  else
  {
   delete_point=RB_findMin(delete_node->right);
   Original_color=delete_point->RB_COLOR;
   delete_point_child=delete_point->right;
   if (delete_point->parent==delete_node)
   {
    delete_point_child->parent=delete_point;
   }
   else
   {
    RB_TRANSPLANT(delete_point,delete_point->right);
    delete_point->right=delete_node->right;
    delete_point->right->parent=delete_point;
   }
   RB_TRANSPLANT(delete_node,delete_point);
   delete_point->left=delete_node->left;
   delete_point->left->parent=delete_point;
   delete_point->RB_COLOR=delete_node->RB_COLOR;
  }
  if (Original_color==BLACK)
  {
   DeleteFixUp(delete_point_child);
  }
  delete delete_node;
  return true;
 }
 /*
 4.5 红黑性质修复
 */
 void DeleteFixUp(RB_NODE* node)
 {
  while(node!=m_root&&node->RB_COLOR==BLACK)
  {
   if (node==node->parent->left)
   {
    RB_NODE* brother=node->parent->right;
    if (brother->RB_COLOR==RED)
    {
     brother->RB_COLOR=BLACK;
     node->parent->RB_COLOR=RED;
     RotateLeft(node->parent);
     brother=node->parent->right;
    }
    else
    {
     if (brother->left->RB_COLOR==BLACK&&brother->right->RB_COLOR==BLACK)
     {
      brother->RB_COLOR=RED;
      node=node->parent;
     }
     else if (brother->right->RB_COLOR==BLACK)
     {
      brother->left->RB_COLOR=BLACK;
      brother->RB_COLOR=RED;
      RotateRight(brother);
      brother=node->parent->right;
     }
     else if (brother->right->RB_COLOR==RED)
     {
      brother->RB_COLOR=node->parent->RB_COLOR;
      node->parent->RB_COLOR=BLACK;
      brother->right->RB_COLOR=BLACK;
      RotateLeft(node->parent);
      node=m_root;
     }
    }
   }
   else
   {
    RB_NODE* brother=node->parent->left;
    if (brother->RB_COLOR==RED)
    {
     brother->RB_COLOR=BLACK;
     node->parent->RB_COLOR=RED;
     RotateRight(node->parent);
     brother=node->parent->left;
    }
    else
    {
     if (brother->right->RB_COLOR==BLACK&&brother->left->RB_COLOR==BLACK)
     {
      brother->RB_COLOR=RED;
      node=node->parent;
     }
     else if (brother->left->RB_COLOR==BLACK)
     {
      brother->right->RB_COLOR=BLACK;
      brother->RB_COLOR=RED;
      RotateLeft(brother);
      brother=node->parent->left;
     }
     else if (brother->left->RB_COLOR==RED)
     {
      brother->RB_COLOR=node->parent->RB_COLOR;
      node->parent->RB_COLOR=BLACK;
      brother->left->RB_COLOR=BLACK;
      RotateRight(node->parent);
      node=m_root;
     }
    }
   }
  }
  m_nullNode->parent=m_root;
  node->RB_COLOR=BLACK;
 }

 void PrintTree(ORDER_MODE eOrderMode)const
 {
  if (ORDER_MODE_PREV==eOrderMode)
   printTreeInPrev(m_root);
  else if (ORDER_MODE_MID==eOrderMode)
   printTreeInMid(m_root);
  else if (ORDER_MODE_POST==eOrderMode)
   printTreeInPost(m_root);
  else
   ;
 }
 void printTreeInPrev(RB_NODE*t) const
 {
  if (t!=m_nullNode)
  {
   cout<<t->key;
   if (t->RB_COLOR==BLACK)
   {
    cout<<"B  ";
   }
   else
    cout<<"R ";
   printTreeInPrev(t->left);
   printTreeInPrev(t->right);
  }
 }
 void printTreeInMid(RB_NODE*t) const
 {
  if (t!=m_nullNode)
  {
   printTreeInMid(t->left);
   cout<<t->key;
   if (t->RB_COLOR==BLACK)
   {
    cout<<"B  ";
   }
   else
    cout<<"R ";
   printTreeInMid(t->right);
  }
 }
 void printTreeInPost(RB_NODE*t) const
 {
  if (t!=m_nullNode)
  {
   printTreeInPost(t->left);
   printTreeInPost(t->right);
   cout<<t->key;
   if (t->RB_COLOR==BLACK)
   {
    cout<<"B  ";
   }
   else
    cout<<"R ";
  }
 }
    void clear(RB_NODE* node)
 {
  if (node==m_nullNode)
  {
   return;
  }
  else
  {
   clear(node->left);
   clear(node->right);
   delete node;
  }
 }
};
#endif _RB_TREE_H_

 

main.cpp:

#include "black_red_tree.h"
#include <vector>
using namespace std;
void main()
{
	RB_Tree<int> tree;
	int a[20]={4,19, 0 ,17 ,10 ,12 ,8 ,11, 18, 1 ,6, 16,7, 14 ,9 ,3 ,13, 2 ,5 ,15};
	vector<int> v(a,a+20);
	for(int i=0;i<v.size();i++)
	{
		cout<<v[i]<<"  ";
	}
	cout<<endl;
	for (int i=0;i<v.size();i++)
	{
		tree.Insert(v[i]);
		cout<<"insert: "<<v[i]<<endl;
		tree.printTreeInMid(tree.m_root);
		cout<<endl;
	}
	cout<<"root: "<<tree.m_root->key<<endl;
	tree.printTreeInPrev(tree.m_root);
		cout<<endl;
	tree.printTreeInMid(tree.m_root);
		cout<<endl;
	tree.printTreeInPost(tree.m_root);
		cout<<endl;
	for (int i=0;i<v.size();i++)
	{
		cout<<"delete: "<<v[i]<<endl;
		tree.Delete(v[i]);
		tree.printTreeInMid(tree.m_root);
	}
	tree.clear(tree.m_root);
	return;
}

运行部分结果如下:

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值