程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 相對完整的紅黑樹(經過比較強的測試)

相對完整的紅黑樹(經過比較強的測試)

編輯:關於C語言

 

注意main函數中的數據順序。

 

 

 

#include  <stdio.h>

#include  <stdlib.h>

 

typedef   enum  _color

  {

    RED,

    BLACK

  }color;

 

typedef   struct  _data

{

  int  value;

}data;

 

typedef  struct  _redblack

{

  color    m_color;

  data   *m_data;

  struct  _redblack  *parent;

  struct  _redblack  *left;

  struct  _redblack  *right;

}redblack;

 

typedef  struct  _wrapdata

{

  redblack  *root;

  int  size;

}wrapdata;

 

int  compare ( redblack  *left ,redblack  *right)

{

  if(left->m_data->value >  right->m_data->value)

    {

      return  1;

    }

  else

    {

      return  0;

    }

}

 

redblack  * newstruct ( data *newdata)

{

  redblack  *newnode;

  newnode=(redblack *)calloc (1 ,sizeof (redblack));

  newnode->m_color=RED;

  newnode->m_data=newdata;

  return  newnode;

}

 

void  rotate_right ( redblack * left ,redblack  *right )

{

 

  right->left=left->right;

  if(left->right)

    {

      left->right->parent=right;

    }

 

  left->right=right;

  left->parent=right->parent;

  if(right->parent)

    {

      if(right->parent->left==right)

 {

      right->parent->left=left;

 }

      else

 {

      right->parent->right=left;

 }

    }

  right->parent=left;

 

}

 

void  rotate_left ( redblack * left ,redblack  *right )

{

  left->right=right->left;

  if (right->left)

    {

      right->left->parent=left;

    }

 

  right->left=left;

  right->parent=left->parent;

  if(left->parent)

    {

      if(left->parent->right==left)

 {

      left->parent->right=right;

 }

      else

 {

      left->parent->left=right;

 }

    }

  left->parent=right;

}

 

void   mid_print (redblack  *root)

{

  if (!root)

    {

      return;

    }

  else

    {

      mid_print (root ->left);

      printf("%d   ",root->m_data->value);

      mid_print  (root  ->right);

    }

}

 

void   left_print (redblack  *root)

{

  if (!root)

    {

      return;

    }

  else

    {

      printf("%d   ",root->m_data->value);

      left_print (root ->left);

      left_print  (root  ->right);

    }

}

 

 

void   right_print (redblack  *root)

{

  if (!root)

    {

      return;

    }

  else

    {

      right_print (root ->left);

      right_print  (root  ->right);

      printf("%d   ",root->m_data->value);

    }

}

 

int  depth(redblack  *root)

{

  int  left,right;

  if (!root)

    {

      return 0;

    }

  else

    {

      left=depth(root->left);

      right=depth(root->right);

      return        left>right ? ( left+1):(right+1);

 

    }

}

void  insert_fixup (wrapdata  *node , redblack *newnode)

{

 

  redblack *curnode;

  redblack  *parent;

  redblack  *grandparent;

  redblack *tmp;

  curnode=newnode;

  parent=curnode->parent;

  while(  curnode->m_color==RED  &&   parent ->m_color==RED)

    {

      grandparent=parent->parent;

      if ( curnode == parent->left)

 {

   if (  parent == grandparent->left)

     {

       curnode->m_color=BLACK;

       rotate_right ( parent , grandparent);

 

       curnode=parent;

              parent=curnode->parent;

              if(!parent )

  {

    node->root=curnode;

    break;

  }

     }

   else

     {

       //       printf("nothing");

       rotate_right (curnode,  parent );

       tmp=parent;

       parent=curnode;

       curnode=tmp;

 

       curnode->m_color=BLACK;

       rotate_left (grandparent ,parent );

 

       curnode=parent;

              parent=curnode->parent;

              if(!parent )

  {

    node->root=curnode;

    break;

  }

 

 

     }

 }

      else

 {

   if (  parent== grandparent->right)

     {

       curnode->m_color=BLACK;

       rotate_left (grandparent,parent );

 

       curnode=parent;

              parent=curnode->parent;

              if(!parent )

  {

    node->root=curnode;

    break;

  }

 

     }

   else

     {

       //       printf("nothing");

       rotate_left (  parent ,curnode);

       tmp=parent;

       parent=curnode;

       curnode=tmp;

 

       curnode->m_color=BLACK;

       rotate_right (parent,grandparent );

 

       curnode=parent;

              parent=curnode->parent;

              if(!parent )

  {

    node->root=curnode;

    break;

  }

     }

 }

    }

}

 

void  insert  ( wrapdata  *node , data *newdata )

{

  redblack  *newnode;

  redblack  *curnode;

 

  newnode=newstruct (newdata);

 

  node->size++;

  if ( ! node->root)

    {

      node->root= newnode;

 

    }

  else

    {

      curnode=node->root;

      while(1)

 {

   if (   compare ( newnode ,curnode))

     {

       if (!curnode->right)

  {

    curnode->right=newnode;

    newnode->parent=curnode;

 

    break;

  }

       else

  {

    curnode=curnode->right;

  }

     }

   else

     {

       if (!curnode->left)

  {

    curnode->left=newnode;

    newnode->parent=curnode;

    break;

  }

       else

  {

    curnode=curnode->left;

  }

 

     }

 

 }

      insert_fixup ( node , newnode);

 

    }

  node->root->m_color=BLACK;

 

}

 

 

int  main()

{

  int  i;

  wrapdata  *node;

  data  *newdata;

  int  value[]={12,24,25,9,4,91,2,100,29,888,10,22,5,11,111,7,13,1,99,222,98,17,8,55,44,33,21,77,199,2345,46,49,51,53,54,52,50,48,47,45,43,42,41,40,39,38,37,78,79,80,81,82,83,84,85};

  node=(wrapdata*)calloc (1  ,sizeof (wrapdata));

  for (i=0;i<sizeof (value)/sizeof(int );i++)

    {

      newdata=(data *)calloc (1 ,sizeof (data));

      newdata->value=value[i];

      insert (node ,newdata);

    } www.2cto.com

 

  printf("%d  \n",depth (node->root));

 

  mid_print (node->root);

  printf("\n");

  left_print (node->root);

  printf("\n");

  right_print (node->root);

  printf("\n");

  return  0;

}

 

  摘自 chenbingchenbing的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved