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

来源:互联网 发布:一致性hash算法原理 编辑:程序博客网 时间:2024/06/07 11:42

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

今天写红黑树的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:为了测试,临时变成publicpublic:    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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 cos还原不了人物怎么办 执行局抓人十五天不放人怎么办 笔记本电脑键盘按键错乱怎么办 靠墙倒立上不去怎么办 医院多收钱了怎么办 学生总是转笔怎么办 吃错东西呕吐怎么办 手腕筋扭伤了怎么办 右膝盖内侧疼痛怎么办 膝盖关节腔积液怎么办 小孩玩游戏花钱怎么办 初三玩手机上瘾怎么办 无线网有感叹号怎么办 台式电脑网络感叹号怎么办 忘记发红包密码怎么办 电信诈骗被骗后怎么办 C小孩讨厌上学怎么办 军训来大姨妈怎么办 夏天军训来月经怎么办 军训遇到大姨妈怎么办 长春市图书馆读者证怎么办 济宁图书馆怎么办读者卡 海南省图书馆读者证怎么办 小孩子特别能吃怎么办 小孩吃不下去药怎么办 小孩不肯去上学怎么办 初中没有团员证怎么办 入团申请书丢了怎么办 刚成立单位社保怎么办 老年人耳鸣怎么办小妙招 老人血压高200怎么办 老人晕车后难受怎么办 老人头晕心里慌怎么办 老人憋的慌怎么办 老人厌食没胃口怎么办 老年人心里整天疑心病怎么办 一个人疑心太重怎么办 我疑心病很重怎么办 老人疑心病太重怎么办 心理有问题该怎么办 老人得了妄想病怎么办