红黑树-高级的二叉查找树
- 平衡树和非平衡树
- 红黑树特征:结点都有颜色,插入和删除结点时要遵循红黑规则;
- 红黑规则
- 每一个结点不是红色就是黑色;
- 跟总是黑色的;
- 如果结点时红色的,则它的子节点必须是黑色的;
- 从根到叶子结点的每条路径,必须包含相同的黑色结点。
- 修正方法
- 改变结点颜色
- 旋转
- 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; }