红黑树 实现 研究

原创 2013年12月05日 14:00:08

看了 程序抽象思想 里面写了部分代码,但是想把它补全,表示很蛋疼!

有问题:

#include "stdio.h"
#include <string>

struct nodeT
{
    nodeT()
        : pLeft(NULL)
        , pRight(NULL)
        , bf(0)
    {

    }
    std::string key;
    nodeT* pLeft;
    nodeT* pRight;
    int bf;
};

void RotateLeft(nodeT*& pTree)
{
    nodeT* pParent = pTree;
    nodeT* pClild = pParent->pRight;

    pParent->pRight = pClild->pLeft;
    pClild->pLeft = pParent;

    pTree = pClild;
}

void RotateRight(nodeT*& pTree)
{
    nodeT* pParent = pTree;
    nodeT* pClild = pParent->pLeft;

    pParent->pLeft = pClild->pRight;
    pClild->pRight = pParent;

    pTree = pClild;
}
void FixLeftBalance(nodeT* pTree)
{
    nodeT* pParent = pTree;
    nodeT* cptr = pParent->pLeft;
    nodeT* pChind = cptr;

    int oldBf = 0;
    if (pChind->bf != pParent->bf)
    {
        oldBf = pChind->pRight->bf;
        RotateLeft(cptr);
        RotateRight(pTree);
        nodeT* t = pTree;
        t->bf = 0;
        switch(oldBf)
        {
        case -1:
            {
                t->pLeft->bf = 0;
                t->pRight->bf = 1;
                break;
            }
        case 1:
            {             
                t->pLeft->bf = -1;
                t->pRight->bf = 0;
                break;
            }
        case 0:
            {
                t->pLeft->bf= 0;
                t->pRight->bf = 0;
                break;
            }
        }
    }
    else
    {
        RotateRight(pTree);
        nodeT* t = pTree;
        t->pRight->bf = 0;
        t->bf = 0;
    }
}
void FixRightBalance(nodeT*& pTree)
{
    nodeT* pParent = pTree;
    nodeT* cptr = pParent->pRight;
    nodeT* pChind = cptr;

    int oldBf = 0;
    if (pChind->bf != pParent->bf)
    {
        oldBf = pChind->pLeft->bf;
        RotateRight(cptr);
        RotateLeft(pTree);
        nodeT* t = pTree;
        t->bf = 0;
        switch(oldBf)
        {
        case -1:
            {
                t->pRight->bf = 0;
                t->pLeft->bf = 1;
                break;
            }
        case 1:
            {             
                t->pRight->bf = -1;
                t->pLeft->bf = 0;
                break;
            }
        case 0:
            {
                t->pRight->bf= 0;
                t->pLeft->bf = 0;
                break;
            }
        }
    }
    else
    {
        RotateLeft(pTree);
        nodeT* t = pTree;
        t->pLeft->bf = 0;
        t->bf = 0;
    }
}
int InsertNode(nodeT*& pTree, std::string key)
{
    if (NULL == pTree)
    {
        pTree = new nodeT;

        pTree->key = key;

        return 1;
    }

    int sign = key.compare(pTree->key);
    if (0 == sign)
    {
        return 0;
    }

    int delta = 0;
    if (sign < 0)
    {
        delta = InsertNode(pTree->pLeft,key);
        if (0 == delta)
        {
            return 0;
        }

        switch(pTree->bf)
        {
        case 1:
            {
                pTree->bf = 0;
                return 0;
            }
        case 0:
            {
                pTree->bf = -1;
                return 1;
            }
        case -1:
            {
                FixLeftBalance(pTree);
                return 0;
            }
        }
    }
    else
    {
        delta = InsertNode(pTree->pRight,key);
        if (0 == delta)
        {
            return 0;
        }
        switch(pTree->bf)
        {
        case -1:
            {
                pTree->bf = 0;
                return 0;
            }
        case 0:
            {
                pTree->bf = 1;
                return 1;
            }
        case 1:
            {
                FixRightBalance(pTree);
                return 0;
            }
        }
    }
}

void PrintfTree(nodeT* pTree)
{
    if (NULL != pTree)
    {
        PrintfTree(pTree->pLeft);

        printf("%s ", pTree->key.c_str());

        PrintfTree(pTree->pRight);
    }
}
int main()
{
    nodeT* pTree = NULL;
    InsertNode(pTree, "1");
    InsertNode(pTree, "2");
    InsertNode(pTree, "111");
    InsertNode(pTree, "3");
    InsertNode(pTree, "4");
    InsertNode(pTree, "5");
    InsertNode(pTree, "-1");

    PrintfTree(pTree);
}


红黑树-JAVA实现(红黑树插入和删除)

红黑树介绍 红黑树是平衡二叉查找树的一种。平衡树在插入和删除的时候,会通过旋转操作将高度保持在logN。其中两款具有代表性的平衡树分别为AVL树和红黑树。AVL树由于实现比较复杂,而且插入和删除性能差...
  • Tcorpion
  • Tcorpion
  • 2017年02月10日 12:41
  • 1467

红黑树深入剖析及Java实现

红黑树深入剖析及Java实现 红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary Search Tree,...
  • u014352080
  • u014352080
  • 2016年12月09日 09:00
  • 2423

红黑树原理解析以及Java实现

红黑树本文的主要内容: 1、红黑树的基本概念以及最重要的5点规则。 2、红黑树的左旋转、右旋转、重新着色的原理与Java实现; 3、红黑树的增加结点、删除结点过程解析;1.红黑树的基本概念与数据...
  • u010853261
  • u010853261
  • 2017年01月10日 15:17
  • 2066

通过分析 JDK 源代码研究 TreeMap 红黑树算法实现

通过分析 JDK 源代码研究 TreeMap 红黑树算法实现 TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 Tre...
  • TopMawei
  • TopMawei
  • 2015年06月26日 09:51
  • 432

通过分析 JDK 源代码研究 TreeMap 红黑树算法实现(自然排序)

TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口...
  • hanruikai
  • hanruikai
  • 2016年08月19日 15:59
  • 745

经典算法研究系列:五、红黑树算法的实现与剖析

经典算法研究系列:五、红黑树算法的实现与剖析 分类: 25.Red-black tree 01.Algorithms(研究)2010-12-31 11:10 40269人阅读 评论(10...
  • robertzhouxh
  • robertzhouxh
  • 2013年03月25日 22:09
  • 364

JDK源代码研究 TreeSet TreeMap 红黑树算法实现

TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口...
  • katelilikatelili
  • katelilikatelili
  • 2015年09月09日 21:47
  • 353

经典算法研究系列:五、红黑树算法的实现与剖析

经典算法研究系列:五、红黑树算法的实现与剖析 分类: 25.Red-black tree 01.Algorithms(研究)2010-12-31 11:10 73618人阅读 评论(11...
  • u014774781
  • u014774781
  • 2015年06月30日 16:02
  • 270

通过分析 JDK 源代码研究 TreeMap 红黑树算法实现

通过分析 JDK 源代码研究 TreeMap 红黑树算法实现 http://www.ibm.com/developerworks/cn/java/j-lo-tree/ Tree...
  • shuxiangxingkong
  • shuxiangxingkong
  • 2013年12月19日 22:43
  • 607

通过分析 JDK 源代码研究 TreeMap 红黑树算法实现

TreeMap 和 TreeSet 是 Java Collection Framework 的两个重要成员,其中 TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常...
  • sinat_23224827
  • sinat_23224827
  • 2015年06月25日 17:14
  • 258
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:红黑树 实现 研究
举报原因:
原因补充:

(最多只允许输入30个字)