数据结构与算法(C语言版)__红黑树02

今天继续丰富红黑树,我们继续上一个博客

今天写红黑树的insert功能
在头文件中添加Except.h和RedBlackTree.h在源文件中添加TestRedBlackTree.cpp

//Except.h
//返回异常
#ifndef EXCEPT_H
#define EXCEPT_H

#include<string>

using namespace std;

class DSException{
public:
    DSException(const string & msg = "") :message(msg){}
    virtual ~DSException(){}
    virtual string toString() const{
        return "Exception " + string(":") + what();
    }
    virtual string what() const{
        return message;
    }
private:
    string message;
};
class DuplicateItemException :public DSException{
public:
    DuplicateItemException(const string & msg = "") :DSException(msg){}
};

#endif
//RedBlackTree.h
//红黑树主要函数
#ifndef RED_BLACK_TREE_H_
#define RED_BLACK_TREE_H_

#include"Except.h"

template<class Comparable>
class RedBlackTree;

template<class Comparable>
class RedBlackNode;

template<class Comparable>
class RedBlackTree{
public:
    RedBlackTree(const Comparable & negInf);//红黑树的构造函数
    ~RedBlackTree();
    enum{RED,BLACK};

    void insert(const Comparable & x);

    typedef RedBlackNode<Comparable> Node;
//private:为了测试,临时变成公有的
public:
    Node *header;
    Node *nullNode;

    Node *current;//当前节点
    Node *parent;//父结点
    Node *grand;//祖父节点
    Node *great;//曾祖父节点
};

template<class Comparable>
class RedBlackNode{
//private:为了测试,临时变成public
public:
    Comparable element;
    RedBlackNode *left;
    RedBlackNode *right;
    int color;

    RedBlackNode(const Comparable & theElement = Comparable(),
        RedBlackNode *lt = NULL,
        RedBlackNode *rt = NULL,
        int c = RedBlackTree<Comparable>::BLACK)
        :element(theElement), left(lt), right(rt), color(c){}

    friend class RedBlackTree<Comparable>;

};

template<class Comparable>
RedBlackTree<Comparable>::RedBlackTree(const Comparable & negInf){
    nullNode = new Node();
    nullNode->left = nullNode->right = nullNode;
    header = new Node(negInf);
    header->left = header->right = nullNode;
}

template<class Comparable>
RedBlackTree<Comparable>::~RedBlackTree(){
    delete nullNode;
    delete header;
}

template<class Comparable>
void RedBlackTree<Comparable>::insert(const Comparable & x){
    current = parent = grand = header;
    nullNode->element = x;
    while (current->element != x){
        great = grand; grand = parent; parent = current;
        current = x < current->element ? current->left : current->right;
    }
    if (current != nullNode)
        throw DuplicateItemException();

    current = new Node(x, nullNode, nullNode);
    if (x < parent->element)
        parent->left = current;
    else
        parent->right = current;

    //自动平衡 -> 红黑树
}
#endif
//TestRedBlackTree.cpp
//测试红黑树
#include<iostream>
#include"RedBlackTree.h"

using namespace std;

int main(){

    cout << "测试红黑树:" << endl;
    const int NEG_INF = -99999;//负的无穷大,
    RedBlackTree<int> t(NEG_INF);//创建一个空树,
    t.insert(30);
    t.insert(15);
    t.insert(70);
    cout << t.header->right->element << endl;
    cout << t.header->right->left->element << endl;
    cout << t.header->right->right->element << endl;
    system("pause");
    return 0;
}

总结:今天写了红黑树的insert功能,但是只是简单的insert,因为还不能改变颜色和旋转,现在只是二叉查找树。下一次博客继续写自动平衡功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值