首页 > 其他 > 详细

红黑树详细介绍三

时间:2014-05-07 07:23:44      阅读:405      评论:0      收藏:0      [点我收藏+]

        根据之前红黑树的原理和《算法导论》上面的伪代码,我用代码将增加和调整的代码实现了一下,如有不对请大家指正。代码可以结合前两篇文章看。

红黑树的详细介绍一

红黑树详细介绍二

/*
 * =====================================================================================
 *
 *       Filename:  rbtree->h
 *
 *    Description:  red black tree
 *
 *        Version:  1->0
 *        Created:  2014年05月05日 08时48分50秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  我叫程序猿XXX  
 *        Company:  
 *
 * =====================================================================================
 */
#ifndef __RBTREE__H
#define __RBTREE__H

#define bool int
#define successed 0
#define failed -1
#define BLACK 0
#define RED 1

typedef struct _rbtree_node{
        struct _rbtree_node *p; 
        struct _rbtree_node *left;
        struct _rbtree_node *right;
        int key;
        int color;
}*p_rbtree_node;


struct _rbtree_node node;

p_rbtree_node getNode(p_rbtree_node x); 
bool leftRotate(p_rbtree_node *root, p_rbtree_node x); 
bool rightRotate(p_rbtree_node *root, p_rbtree_node x);
bool rbInert(p_rbtree_node *root, p_rbtree_node z);
bool rbInsertFixup(p_rbtree_node *root, p_rbtree_node z);
bool rbBuilt(void);
void rbDisplay(p_rbtree_node *root);
void Display(void);

#endif

rbtree.c

/*
 * =====================================================================================
 *
 *       Filename:  rbtree.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2014年05月05日 09时01分00秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  我叫程序猿XXX 
 *        Company:  
 *
 * =====================================================================================
 */
#include "rbtree.h"
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
p_rbtree_node nil = &node;
p_rbtree_node root;

p_rbtree_node getNode(p_rbtree_node x)
{
        x = NULL;
        x = (p_rbtree_node)malloc(sizeof(struct _rbtree_node));
        if (x == NULL)
        {
                return NULL;
        }
        memset(x, 0, sizeof(struct _rbtree_node));

        return x;
}

bool leftRotate(p_rbtree_node *root, p_rbtree_node x)
{
        p_rbtree_node y = NULL;
        y = x->right;   //set y
        x->right = y->left;
        if (y->left !=  nil)
                y->left->p = x;
        y->p = x->p;
        if (x->p == nil)
                *root = y;
        else if (x == x->p->left)
                x->p->left = y;
        else
                x->p->right = y;
        y->left = x;
        x->p = y;

        return successed;
}

bool rightRotate(p_rbtree_node *root, p_rbtree_node x)
{
        p_rbtree_node y = NULL;
        y = x->left;
        x->left = y->right;
        if (y->right != nil)
                y->right->p = x;
        y->p = x->p;
        if (x->p == nil)
                *root = y;
        else if (x == x->p->left)
                x->p->left = y;
        else
                x->p->right = y;
        y->right = x;
        x->p = y;

        return successed;
}

bool rbInsert(p_rbtree_node *root, p_rbtree_node z)
{
        p_rbtree_node y = nil;
        p_rbtree_node x = *root;
        while (x != nil)
        {
                y = x;
                if (z->key < x->key)
                        x = x->left;
                else
                        x = x->right;
        }
        z->p = y;
        if (y == nil)
        {
                *root = z;
        }
        else if (z->key < y->key)
                y->left = z;
        else
                y->right = z;
        z->left = nil;
        z->right = nil;
        z->color = RED;
        rbInsertFixup(root, z);

        return successed;
}

bool rbInsertFixup(p_rbtree_node *root, p_rbtree_node z)
{
        while (z->p->color == RED)
        {
                p_rbtree_node y = NULL;
                if (z->p == z->p->p->left)
                {
                        y = z->p->p->right;
                        if (y->color == RED)
                        {
                                z->p->color = BLACK;
                                y->color = BLACK;
                                z->p->p->color = RED;
                                z = z->p->p;
                        }
                        else if (z == z->p->right)
                        {
                                z = z->p;
                                leftRotate(root, z);
                        }
                        else
                        {
                                z->p->color = BLACK;
                                z->p->p->color = RED;
                                rightRotate(root, z->p->p);
                        }
                }
                else
                {
                        y = z->p->p->left;
                        if (y->color == RED)
                        {
                                z->p->color = BLACK;
                                y->color = BLACK;
                                z->p->p->color = RED;
                                z = z->p->p;
                        }
                        else if (z == z->p->left)
                        {
                                z = z->p;
                                rightRotate(root, z);
                        }
                        else
                        {
                                z->p->color = BLACK;
                                z->p->p->color = RED;
                                leftRotate(root, z->p->p);
                        }
                }
        }
        (*root)->color = BLACK;
        return successed;
}

bool rbBuilt()
{
        node.p = NULL;
        node.left = NULL;
        node.right = NULL;
        node.key = -1;
        node.color = BLACK;
        root = nil;
        p_rbtree_node n1 = getNode(n1);
        n1->key = 1;
        rbInsert(&root, n1);

        p_rbtree_node n2 = getNode(n2);
        n2->key = 2;
        rbInsert(&root, n2);

        p_rbtree_node n4 = getNode(n4);
        n4->key = 4;
        rbInsert(&root, n4);

        p_rbtree_node n5 = getNode(n5);
        n5->key = 5;
        rbInsert(&root, n5);

        p_rbtree_node n7 = getNode(n7);
        n7->key = 7;
        rbInsert(&root, n7);

        p_rbtree_node n8 = getNode(n8);
        n8->key = 8;
        rbInsert(&root, n8);

        p_rbtree_node n11 = getNode(n11);
        n11->key = 11;
        rbInsert(&root, n11);

        p_rbtree_node n14 = getNode(n14);
        n14->key = 14;
        rbInsert(&root, n14);

        p_rbtree_node n15 = getNode(n15);
        n15->key = 15;
        rbInsert(&root, n15);

        return successed;
}

void rbDisplay(p_rbtree_node *root)
{
        if (*root == nil)
                return;
        rbDisplay(&((*root)->left));
        if ((*root)->color == RED)
                printf("key=%d, color=RED\n", (*root)->key);
        else
                printf("key=%d, color=BLACK\n", (*root)->key);
        rbDisplay(&((*root)->right));
}

void rbMidDisplay(p_rbtree_node *root)
{
        if (*root == nil)
                return;
        if ((*root)->color == RED)
                printf("key=%d, color=RED\n", (*root)->key);
        else
                printf("key=%d, color=BLACK\n", (*root)->key);
        rbMidDisplay(&((*root)->left));
        rbMidDisplay(&((*root)->right));
}

void Display(void)
{
        rbDisplay(&root);
        rbMidDisplay(&root);
}

test.c 测试文件

*
 * =====================================================================================
 *
 *       Filename:  test.c
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2014年05月05日 11时34分19秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  我叫程序猿XXX  
 *        Company:  
 *
 * =====================================================================================
 */
#include "rbtree.h"
#include <stdio.h>

int main(void)
{
        rbBuilt();
        Display();
        return 0;
}

    代码的运行截图如下:

bubuko.com,布布扣

    代码是通过先序和中序遍历得出的结果。

    我的编译系统是Linux,编译环境是gcc 版本 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC) 。后面将删除代码添加上。如果代码中有任何不对的地方,请大家指出,我好及时修改,谢谢大家。

红黑树详细介绍三,布布扣,bubuko.com

红黑树详细介绍三

原文:http://blog.csdn.net/qianligaoshan/article/details/25090527

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!