红黑树-高级的二叉查找树
- 平衡树和非平衡树
- 红黑树特征:结点都有颜色,插入和删除结点时要遵循红黑规则;
- 红黑规则
- 每一个结点不是红色就是黑色;
- 跟总是黑色的;
- 如果结点时红色的,则它的子节点必须是黑色的;
- 从根到叶子结点的每条路径,必须包含相同的黑色结点。
- 修正方法
- 改变结点颜色
- 旋转
- C++函数库包含的红黑树
- #include<set>
- #include<map>
- C++实现红黑树,主要类如下
- Class RedBlackTree
- Class RedBlackNode
- NullNode
- Header
- 一个空的红黑树RedBlackTree.h
#pragma once #ifndef RED_BLACKT_REE_H_ #define RED_BLACKT_REE_H_//模板类声明 template <class comparable> class RedBlackTree; template <class comparable> class RedBlackNode;//类定义 template <class comparable> class RedBlackTree { private:RedBlackNode<comparable> *header; //红黑树头结点RedBlackNode<comparable> *nullNode;//空结点public:enum {RED,BLACK}; //枚举颜色,放在RedBlackTree类内部;RedBlackTree(const comparable& h);~RedBlackTree(); };template <class comparable> class RedBlackNode {comparable element;RedBlackNode* left;RedBlackNode* right;int color;RedBlackNode(const comparable& ele=comparable(),//comparable类型是传递进来的类型,缺省参数赋初值是需要使用自己的类型,注意写法。RedBlackNode *l=NULL,RedBlackNode* r=NULL,int c=RedBlackTree<comparable>::BLACK): element(ele),left(l),right(r),color(c) //成员函数赋初值{}//友元类,RedBlackTree类可以方位RedBlackNode类的默认的private成员数据,注意在哪个类中声明友元friend class RedBlackTree<comparable>; }; #endif//类成员函数定义 template<class comparable> RedBlackTree<comparable>::RedBlackTree(const comparable & h) {//new创建节点,存储指向根节点的指针,不存储其他数据nullNode = new RedBlackNode<comparable>();//使用缺省参数构造,nullNode->left = nullNode;nullNode->right = nullNode;//红黑树头指针,指向根节点,头指针也是一个结点,也需要使用new创建,只是其不存储数据,仅作存储根节点,用于指向根节点。header = new RedBlackNode<comparable>(h);header->left = nullNode;header->right = nullNode; }template<class comparable> inline RedBlackTree<comparable>::~RedBlackTree() {delete nullNode;delete header; }