红黑树的代码实现

红黑树实际上是一种高效的平衡二叉树,它的平衡性不如avl树严格,但是统计性能更高,在对大数据的信息进行排序查找操作时,如果对效率的要求不是特别的高,红黑树是一个恰当的选择,相对于散列表,红黑树的“代码复杂程度”更低,因为散列表要牵涉到散列函数,一个优越的散列函数并不是那么容易构造。关于红黑树与AVL树的对比,请参阅:http://wangdei.iteye.com/blog/236157

下面是红黑树实现的代码,代码经过测试。

/*********************************************************************************
*rb_tree.h
*Version:  
*Date:  July 2013
*Description:  insert,search,free function of rbTree
*History:  none
**********************************************************************************/ 
#ifndef  RBTREE
#define  RBTREE
#include <stdio.h>
#include <iostream>

//
//data type define
//
extern struct Triangle;


struct ElemType
{
    ElemType()
    {
    }
    ~ElemType()
    {
    }
    float* coor;

    bool operator >( const ElemType& e1 ) const
    {
        if ( coor[0] > e1.coor[0] )
        {
            return true;
        }
        else if ( coor[0] == e1.coor[0] && coor[1] > e1.coor[1] )
        {
            return true;
        }
        else if ( coor[0] == e1.coor[0] && coor[1] == e1.coor[1] && coor[2] > e1.coor[2] )
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    bool operator <( const ElemType& e1 ) const
    {
        if ( coor[0] < e1.coor[0] )
        {
            return true;
        }
        else if ( coor[0] == e1.coor[0] && coor[1] < e1.coor[1] )
        {
            return true;
        }
        else if ( coor[0] == e1.coor[0] && coor[1] == e1.coor[1] && coor[2] < e1.coor[2] )
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    bool operator ==( const ElemType& e1 ) const
    {
        if ( coor[0] == e1.coor[0] && coor[1] == e1.coor[1] && coor[2] == e1.coor[2] )
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    ElemType& operator=( const ElemType& e1 )
    {
        coor = e1.coor;

        return *this;
    }
}; 


//红黑树节点类
typedef struct rb_node
{
    rb_node( ElemType* data )
    {
        this->data = data;
    }

    rb_node()
    {
        this->data = 0;
    }

    ~rb_node()
    {
    }

    ElemType* data; 
    char color;//R,B--red,black
    struct rb_node* pa;//parent
    struct rb_node* left;    
    struct rb_node* right;
}rb_node, rb_tree;



class RB_Tree
{
  public:
    RB_Tree()
    {
        rb_root = new rb_tree( 0 );

        rb_root->pa = rb_root;
        rb_root->left = rb_root;
        rb_root->right = rb_root;
        rb_root->color = 'B';

        size = 0;
    }

    ~RB_Tree()
    {
        delete rb_root;

        rb_root = 0;
    }

    int rb_tree_insert( rb_node* node );//插入节点

    void rb_get_node( rb_node* node );//设置空节点

    int rb_tree_fixup( rb_node* node );//修正操作(左旋,右旋)

    rb_node* rb_tree_init( rb_node* a );//初始化红黑树

    int rbtree_output( char* filePath );//for test

    bool rbtree_search( ElemType& key ); //search element

    int free_rbtree();//清空

    int shallow_free_rbtree();//浅清空,指针置为零,不删除内容

    rb_node* tree_successor( rb_node* node );//node的后继

    rb_node* tree_first();//返回第一个节点

    int rb_get_array( rb_node* node_array, int& count );//前序遍历返回所以节点

    int size;

  private:
    rb_tree* rb_root;



    int rb_tree_insert( rb_tree* tree, rb_node* node );

    int free_rbtree( rb_tree* );

    int rbtree_output( char*& mainchar, rb_tree* tree, int level );

    bool rbtree_search( rb_tree* node, ElemType& key );

    int rbtree_left_rotate( rb_tree* tree, rb_node* node );

    int rbtree_right_rotate( rb_tree* tree, rb_node* node );

    int rb_tree_fixup( rb_tree* tree, rb_node* node );

    int os_key_rank( rb_tree* tree, ElemType& key );
    int os_rank( rb_tree* tree, rb_node* node );
    int right_tree_num( rb_node* node );
    int left_tree_num( rb_node* node );

    int shallow_free_rbtree( rb_tree* );

    int rb_get_array( rb_node* node_array, int& count, rb_node node );
};

#endif



#include "rb_tree.h"


int RB_Tree::free_rbtree()
{
  rb_tree* tree = rb_root;

  if ( tree->left != rb_root )
  {
    free_rbtree( tree->left );
  }

  if ( tree->right != rb_root )
  {
    free_rbtree( tree->right );
  }

  delete tree;
  tree = 0;
  return 0;
}

rb_node* RB_Tree::rb_tree_init( rb_node* root )
{
  root->color = 'B';
  root->left = rb_root;//nil
  root->right = rb_root;
  root->pa = rb_root; 
  rb_root->left = rb_root->right = root;

  size = 1;

  return rb_root->left;
}

int RB_Tree::free_rbtree( rb_tree* tree )
{
  if ( tree->left != rb_root )
  {
    free_rbtree( tree->left );
  }

  if ( tree->right != rb_root )
  {
    free_rbtree( tree->right );
  }

  delete tree;
  tree = 0;
  return 0;
}

int RB_Tree::left_tree_num( rb_node* node )
{
  int left, right, leftnum;
  if ( node == rb_root )
  {
    return 0;
  }
  else if ( node->left != rb_root )
  {
    left = left_tree_num( node->left );
    right = right_tree_num( node->left );
    leftnum = left + right + 1;
  }
  else
  {
    return 0;
  }
  return leftnum;
}

int RB_Tree::right_tree_num( rb_node* node )
{
  int left, right, rightnum;
  if ( node == rb_root )
  {
    return 0;
  }
  else if ( node->right != rb_root )
  {
    left = left_tree_num( node->right );
    right = right_tree_num( node->right );
    rightnum = left + right + 1;
  }
  else
  {
    return 0;
  }
  return rightnum;
}


int RB_Tree::os_rank( rb_tree* tree, rb_node* node )
{
  rb_node* y;
  int rank;
  rank = left_tree_num( node ) + 1;
  y = node;
  while ( y != rb_root->left )
  {
    if ( y == y->pa->right )
    {
      rank = rank + left_tree_num( y->pa ) + 1;
    }
    y = y->pa;
  }
  return rank;
}

int RB_Tree::os_key_rank( rb_tree* tree, ElemType& key )
{
  int num;
  rb_node* node;
  node = tree;
  while ( !( *( node ->data ) == key ) )
  {
    if ( *( node->data ) > key )
    {
      node = node ->left;
    }
    else
    {
      node = node ->right;
    }
  }
  if ( node == rb_root )
  {
    return -1;
  }
  num = os_rank( tree, node );
  return num;
}





//LDR中序遍历输出
int RB_Tree::rbtree_output( char*& mainchar, rb_tree* tree, int level )
{
  int i = 0,lev = level;

  char* tempchar = new char[1024];

  //  fprintf(result,"(%d%c, \n",tree->data,tree->color);
  sprintf( tempchar, "(%f %f %f %c, \n", tree->data->coor[0], tree->data->coor[1], tree->data->coor[2], tree->color );

  strcat( mainchar, tempchar );

  if ( tree->left != rb_root )
  {
    //rb_root = nil
    for ( i = 0; i <= level; i++ )
    {
      //fprintf(result,"\t");
      sprintf( tempchar, "\t" );
      strcat( mainchar, tempchar );
    }
    rbtree_output( mainchar, tree->left, ++level );
  }
  else
  {
    for ( i = 0; i <= level; i++ )
    {
      sprintf( tempchar, "\t" );
      strcat( mainchar, tempchar );
    }
    sprintf( tempchar, "NIL,\n" );
    strcat( mainchar, tempchar );
    //    fprintf(result,"NIL,\n");
  }
  //  system("pause");
  if ( tree->right != rb_root )
  {
    for ( i = 0; i <= lev; i++ )
    {
      sprintf( tempchar, "\t" );
      strcat( mainchar, tempchar );
    }
    rbtree_output( mainchar, tree->right, ++lev );
  }
  else
  {
    for ( i = 0; i <= lev; i++ )
    {
      sprintf( tempchar, "\t" );
      strcat( mainchar, tempchar );
    }
    sprintf( tempchar, "NIL)\n" );
    strcat( mainchar, tempchar );
  }
  delete[] tempchar;
  return 0;
}

//LDR中序遍历输出
int RB_Tree::rbtree_output( char* filePath )
{
  FILE* fp;

  if ( ( fp = fopen( filePath, "w+" ) ) == NULL )
  {
    printf( "can not open this file\n" );

    return false;
  }

  char* mainchar = new char[1024000];

  char* tempchar = new char[1024];


  memset( mainchar, 0, sizeof( char ) * 1024000 );
  memset( tempchar, 0, sizeof( char ) * 1024 );

  rb_tree* tree = rb_root->left;
  int level = 0;


  //right & left
  int i = 0,lev = level;



  //  fprintf(result,"(%d%c, \n",tree->data,tree->color);
  sprintf( tempchar, "(%f %f %f %c, \n", tree->data->coor[0], tree->data->coor[1], tree->data->coor[2], tree->color );
  strcat( mainchar, tempchar );
  if ( tree->left != rb_root )
  {
    //rb_root = nil
    for ( i = 0; i <= level; i++ )
    {
      //fprintf(result,"\t");
      sprintf( tempchar, "\t" );
      strcat( mainchar, tempchar );
    }
    rbtree_output( mainchar, tree->left, ++level );
  }
  else
  {
    for ( i = 0; i <= level; i++ )
    {
      sprintf( tempchar, "\t" );
      strcat( mainchar, tempchar );
    }
    sprintf( tempchar, "NIL,\n" );
    strcat( mainchar, tempchar );

    //    fprintf(result,"NIL,\n");
  }
  //  system("pause");
  if ( tree->right != rb_root )
  {
    for ( i = 0; i <= lev; i++ )
    {
      sprintf( tempchar, "\t" );
      strcat( mainchar, tempchar );
    }
    rbtree_output( mainchar, tree->right, ++lev );
  }
  else
  {
    for ( i = 0; i <= lev; i++ )
    {
      sprintf( tempchar, "\t" );
      strcat( mainchar, tempchar );
    }
    sprintf( tempchar, "NIL)\n" );
    strcat( mainchar, tempchar );
  }


  fputs( mainchar, fp );

  delete[] tempchar;

  delete[] mainchar;

  fclose( fp );

  return 0;
}






rb_node* RB_Tree::tree_first()//node的后继
{
  rb_node* p;

  p = rb_root->left;

  if ( p == rb_root )
  {
    return NULL;
  }

  return p;
}

rb_node* RB_Tree::tree_successor( rb_node* node )//node的后继
{
  rb_node* p;

  p = node->right;

  if ( p == rb_root )
  {
    return NULL;
  }

  while ( p->left != rb_root )
  {
    p = p->left;
  }

  return p;
}
int RB_Tree::rb_tree_insert( rb_tree* tree, rb_node* node )
{
  if ( node == NULL || tree == NULL )
  {
    return 0;
  }

  rb_node* p = NULL;
  rb_node* t = tree;   

  while ( t != rb_root )
  {
    p = t ;

    if ( *( node->data ) < *( t->data ) )
    {
      t = t->left;
    }
    else if ( *( node->data ) > *( t->data ) )
    {
      t = t->right;
    }
    else if ( *( node->data ) == *( t->data ) )
    {
      return 0;
    }
  }

  if ( *( node->data ) < *( p->data ) )
  {
    p->left = node;
  }
  else
  {
    p->right = node;
  }

  size++;

  node->pa = p;
  node->color = 'R';

  return 1;
}


int RB_Tree::rb_get_array( rb_node* node_array, int& count )
{
  if ( rb_root->left == rb_root )
  {
    return 0;
  }

  count = 0;

  node_array[count] = *( rb_root->left );

  count++;

  if ( rb_root->left->left != rb_root )
  {
    rb_get_array( node_array, count, *( rb_root->left->left ) );
  }

  if ( rb_root->left->right != rb_root )
  {
    rb_get_array( node_array, count, *( rb_root->left->right ) );
  }

  return 1;
}

int RB_Tree::rb_get_array( rb_node* node_array, int& count, rb_node src_node )
{
  node_array[count] = src_node;

  count++;

  if ( src_node.left != rb_root )
  {
    rb_get_array( node_array, count, *( src_node.left ) );
  }

  if ( src_node.right != rb_root )
  {
    rb_get_array( node_array, count, *( src_node.right ) );
  }

  return 1;
}


int RB_Tree::rb_tree_insert( rb_node* node )
{
  rb_get_node( node );
  return rb_tree_insert( rb_root->left, node );
}


int RB_Tree::rb_tree_fixup( rb_node* node )
{
  return rb_tree_fixup( rb_root->left, node );
}


int RB_Tree::rb_tree_fixup( rb_tree* tree, rb_node* node )
{
  while ( node->pa->color == 'R' )
  {
    if ( node->pa == node->pa->pa->left )
    {
      if ( node->pa->pa->right->color == 'R' )
      {
        node = node->pa->pa;
        node->left->color = node->right->color = 'B';
        node->color = 'R';
      }
      else
      {
        if ( node->pa->right == node )
        {
          node = node->pa; 
          rbtree_left_rotate( tree, node );
        }
        node->pa->color = 'B';
        node->pa->pa->color = 'R';
        rbtree_right_rotate( tree, node->pa->pa );
      }
    }
    else
    {
      if ( node->pa->pa->left->color == 'R' )
      {
        node = node->pa->pa;
        node->left->color = node->right->color = 'B'; 
        node->color = 'R';
      }
      else
      {
        if ( node->pa->left == node )
        {
          node = node->pa;

          rbtree_right_rotate( tree, node );
        } 

        node->pa->color = 'B'; 
        node->pa->pa->color = 'R';
        rbtree_left_rotate( tree, node->pa->pa );
      }
    }
  }
  rb_root->left->color = 'B';
  return 0;
}


int RB_Tree::rbtree_left_rotate( rb_tree* tree, rb_node* node )
{
  rb_node* c;

  c = node->right;

  if ( node->right == rb_root )
  {
    return 1;
  }

  if ( node->pa != rb_root )
  {
    if ( node->pa->left == node )
    {
      node->pa->left = c;
    }
    else
    {
      node->pa->right = c;
    }
  }
  else
  {
    rb_root->left = c;
  }
  c->pa = node->pa;

  node->right = c->left;
  if ( c->left != rb_root )
  {
    c->left->pa = node;
  }
  c->left = node;
  node->pa = c; 

  return 0;
}

int RB_Tree::rbtree_right_rotate( rb_tree* tree, rb_node* node )
{
  rb_node* c;   

  c = node->left;

  if ( node->left == rb_root )
  {
    return 1;
  }    

  if ( node->pa != rb_root )
  {
    if ( node->pa->left == node )
    {
      node->pa->left = c;
    }
    else
    {
      node->pa->right = c;
    }
  }
  else
  {
    rb_root->left = c;
  }
  c->pa = node->pa;   
  node->left = c->right;
  if ( c->right != rb_root )
  {
    c->right->pa = node;
  }
  c->right = node;
  node->pa = c;

  return 0;
}

bool RB_Tree::rbtree_search( ElemType& key )
{
  rb_tree* tree = rb_root->left;
  return rbtree_search( tree, key );
}

bool RB_Tree::rbtree_search( rb_tree* tree, ElemType& key )
{
  if ( rb_root->left == rb_root )
  {
    return false;
  }

  rb_node* node;
  node = rb_root->left;//rb_root->left 指向根,所有叶子指向rb_root;

  if ( node != tree )
  {
    printf( "rb_tree error\n" );
    return false;
  }

  while ( node != rb_root )
  {
    if ( *( node->data ) < key )
    {
      node = node->right;
    }
    else if ( *( node->data ) > key )
    {
      node = node->left;
    }
    else if ( *( node->data ) == key )
    {
      break;
    }
  }
  if ( node == rb_root )
  {
    printf( "No key %f %f %f in rbtree!\n", key.coor[0], key.coor[1], key.coor[2] );

    tree = rb_root->left;

    return false;
  }

  tree = node;

  return true;
}

void RB_Tree::rb_get_node( rb_node* node )
{
  node->color = 'W';
  node->pa = rb_root;
  node->left = rb_root;
  node->right = rb_root;
}

int RB_Tree::shallow_free_rbtree()
{
  rb_tree* tree = rb_root;

  if ( tree->left != rb_root )
  {
    shallow_free_rbtree( tree->left );
  }

  if ( tree->right != rb_root )
  {
    shallow_free_rbtree( tree->right );
  }

  tree = NULL;
  return 0;
}

int RB_Tree::shallow_free_rbtree( rb_tree* tree )
{
  if ( tree->left != rb_root )
  {
    shallow_free_rbtree( tree->left );
  }

  if ( tree->right != rb_root )
  {
    shallow_free_rbtree( tree->right );
  }

  tree = NULL;

  return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值