红黑树的各种操作

来源:互联网 发布:淘宝运营投资计划表 编辑:程序博客网 时间:2024/05/22 03:15

                                                    红黑树各种操作

// 红黑树各种操作.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream>
using namespace std;
enum MyColor{red,black};
typedef int DType;

struct RBTree
{
 DType data;
 MyColor col;
 RBTree *parent;
 RBTree *left;
 RBTree *right;
};
//查询节点信息
RBTree * search(RBTree * r,DType val)
{
 RBTree *x = r;
 while(x!=NULL&&x->data!=val)
 {
  if(x->data>val)
   x = x->left;
  else
   x = x->right;
 }
 return x;
}
//左旋转
RBTree * left_rotate(RBTree * r,RBTree *x)
{
 RBTree *y = x->right;
 x->right = y->left;
 if(y->left!=NULL)
  y->left->parent = x;
 y->parent = x->parent;
 if(x->parent==NULL)
  r=y;
 else if(x==x->parent->left)
  x->parent->left = y;
 else
  x->parent->right = y;
 y->left=x;
 x->parent = y;
 return r;
}
//右旋转
RBTree * right_rotate(RBTree* r,RBTree *x)
{
 RBTree *y = x->left;
 x->left = y->right;
 if(y->right!=NULL)
  y->right->parent = x;
 y->parent = x->parent;
 if(x->parent==NULL)
  r=y;
 else if(x==x->parent->left)
  x->parent->left = y;
 else
  x->parent->right = y;
 y->right = x;
 x->parent = y;
 return r;
}
//插入元素后,保持红黑性
RBTree* keep_insert_RBTree(RBTree  *r,RBTree *s)
{
 while(s->parent->col==red)
 {
  if(s->parent==s->parent->parent->left)
  {
   RBTree *y = s->parent->parent->right;
   if(y->col==red)
   {
    y->col = black;
    s->parent->col = black;
    s->parent->parent->col=red;
    s = s->parent->parent;
   }
   else
   {
    if(s==s->parent->right)
    {
    s = s->parent;
    r = left_rotate(r,s);
    }
    s->parent->col = black;
    s->parent->parent = red;
    r = right_rotate(r,s->parent->parent);
   }
  }
  else
  {
   RBTree *y = s->parent->parent->left;
   if(y->col==red)
   {
    y->col = black;
    s->parent->col = black;
    s->parent->parent->col = red;
    s = s->parent->parent;
   }
   else
   {
    if(s==s->parent->left)
    {
     s = s->parent;
     r = right_rotate(r,s);
    }
    s->parent->col = black;
    s->parent->parent = red;
    r = left_rotate(r,s->parent->parent);
   }
  }
 }
 r->col = black;
 return r;
}
//插入元素
RBTree *insert(RBTree *r,RBTree *s)
{
 RBTree *p = search(r,s->data);
 if(P==NULL)
 {
  RBTree *y=NULL;
  RBTree *x=r;
  while(x!=NULL)
  {
   y = x;
   if(s->data<x->data)
    x = x->left;
   else
    x = x->right;
  }
  s->parent = y;
  if(y==NULL)
   r = s;
  else if(s->data<y->data)
   y-left = s;
  else
   y->right = s;
  s->left = NULL;
  s->right = NULL;
  s->col = red;
  r = keep_insert_RBTree();
 }
 return r;
}
//取得最小值节点
RBTree * get_min(RBTree *r)
{
 RBTree * s = r;
 while(s->left!=NULL)
  s = s->left;
 return s;
}
//取得最大值节点
RBTree * get_max(RBTree *r)
{
 RBTree *s = r;
 while(s->right!=NULL)
  s = s->right;
 return s;
}
//取得中序前驱节点
RBTree * get_processor(RBTree *r,DType val)
{
    RBTree *p = search(r,val);
  if(p==NULL)
   return NULL;
  else
  {
   if(p->left != NULL)
    return get_max(r);
   else
   {
    RBTree *q = p->parent;
    while(q!=NULL&&p==q->parent->left)
    {
     p = q;
     q = p->parent;
    }
    return q;
   }
  }
}
//取得中序后继节点
RBTree * get_successor(RBTree *r,DType val)
{
 RBTree *p = search(r,val);
  if(p==NULL)
   return NULL;
  else
  {
   if(p->right != NULL)
    return get_min(r);
   else
   {
    RBTree *q = p->parent;
    while(q != NULL&&p==q->right)
    {
     p = q;
     q = p->parent;
    }
    return q;
   }
  }
}
//删除节点操作
RBTree *delete_node(RBTree *r,int val)
{
 RBTree *p = search(r,val);
 RBTree *y,*x;
 if(p != NULL)
 {
  if(p->left==NULL||p->right==NULL)
   y = p;
  else
   y = get_successor(r,val);
  if(y->left != NULL)
   x = y->left;
  else
   x = y->right;
  if(x != NULL)
   x->parent = y->parent;
  if(y->parent == NULL)
   r = x;
  else if(y == x->parent->left)
   x->parent->left = x;
  else
   x->parent->right = x;
  if(y != p)
  {
   p->data = y->data;
  }
  if(y->col==black)
   r = keep_delete_RBTree(r,x);
 }
 return r;
}
//保持删除节点后,树的红黑性
RBTree *keep_delete_RBTree(RBTree *r,RBTree *s)
{
 while(s != r&&s->col==black)
 {
  if(s==s->parent->left)
  {
   RBTree *w = s->parent->right;
   if(w->col==red)
   {
    w->col = black;
    s->parent->col = red;
    lr = eft_rotate(r,s->parent);
    w = s->parent->right;
   }
    if(w->left->col==black&&w->right->col==black)
   {
     w->col=red;
     s = s->parent;
   }
    else if(w->right->col==black)
    {
     w->left->col = black;
     w->col = red;
     r = right_rotate(r,w);
     w = s->parent->right;
    }
    else
    {
     w->col =  s->parent->col;
     s->parent->col = black;
     w->right->col = black;
     r = left_rotate(r,s->parent);
     s = r;
    }
  }
  else
  {
   same as the case of "left";
  }
 }

 s->col = black;

 return r;
}
int _tmain(int argc, _TCHAR* argv[])
{

    ......code.......
 return 0;
}

 

 

原创粉丝点击