为什么要有红黑树搜索树性能不稳定达不到logn—>avl树,不好控制–>红黑树
特点:比avl简单但是更抽象
avl树左右高度差不超过1,是严格的平衡树,两个结点就是1
红黑树达到的是近似平衡树保证最长路径不超过最短路径的二倍
红黑树是一种二叉搜索树但是在每个结点上增加一个存储位表示颜色,颜色可以为red/balck通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的------------切记红黑树是近平衡的
红黑树的性质
1每个结点不是黑色就是红色
2根是黑色
3. 如果一个节点是红色的,则它的两个孩子结点是黑色的
4. 对于每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点 —保证了最长路径不超过最短路径的二倍
对结点进行标记,根节点是黑色,一个结点红色孩子一定是黑也就是只有–>红黑 黑黑,没有红红,所以—>
每条路径上有相同路径的黑结点四点约束达到了最长路径不超过最短路径的二倍,
最短路径一定是全黑最长路径一定是黑+红
如图所示
黑结点的路径为h
2^h-1=n/2~n
h=2logn
严格来说avl快红黑树为2logn,avl树为logn(log以2为底n的对数)
本文也是主要讲的红黑树的插入
因为是每个结点增加一个存储位表示颜色所以定义结点为pair结构最好
template<class K, class V>
struct BSTreeNode
{
pair<K, V> _kv;
BSTreeNode<K, V>* _left;
BSTreeNode<K, V>* _right;
BSTreeNode(const pair<K, V>& kv)
:_left(nullptr)
, _right(nullptr)
, _kv(kv)
{}
};
也是三叉链
template<class K, class V>
struct BSTreeNode//定义结点
{
pair<K, V> _kv;
BSTreeNode<K, V>* _left;
BSTreeNode<K, V>* _right;
BSTreeNode(const pair<K,