二叉查找树的问题在于它自己把第一个节点设置成根结点,红黑树就可以进行动态调整根节点,自动平衡二叉查找树。
平衡树和非平衡树
红黑树的特征:节点都有颜色,插入和删除节点时要遵守红黑树规则
红黑树规则:
1.每个节点不是红色就是黑色的。
2.根总是黑色的。
3.如果节点是红色的,则它的子结点必须是黑色的。
4.从根到叶结点的每条路径,必须包含相同数目的黑色节点。
修正方法:
1.改变节点的颜色
2.旋转
接下来的几次博客里面会一点点写出一个红黑树。
今天先尝试创建一个空的红黑树
在VS2013中创建新的项目
在头文件中添加RedBlackTree.h在源文件中添加TestRedBlackTree.cpp
//RedBlackTree.h
#ifndef RED_BLACK_TREE_H_
#define RED_BLACK_TREE_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};
typedef RedBlackNode<Comparable> Node;
private:
Node *header;
Node *nullNode;
};
template<class Comparable>
class RedBlackNode{
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;
}
#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);//创建一个空树,
system("pause");
return 0;
}
总结:因为红黑树的代码比较复杂,写起来代码也比较长,我们分几次博客,把红黑树写出来,今天就只创建一个空的红黑树,它有一个伪根,在后面的博客里面继续丰富我们的红黑树。