【C++】二叉搜索树之--红黑树

        红黑树,是二叉搜索树的一种,它的每个节点只有红色黑色,从而达到接近平衡的目的。

红黑树的性质:

·根节点都是黑色节点

·每个节点不是黑的就是红的

·如果一个节点是红的,那么它的两个孩子都是黑的

·不能右两个连续的红色节点

·每条路径下,黑色节点的数量都是相等的

·叶子节点都是黑色节点(这里指空节点)

·根节点到叶子节点最长的路径,最多是最短路径的2倍(最短路径都是黑子,最长路径是一黑一红)

红黑树的原理:

和AVL树不一样的是,没有平衡因子,而是节点的结构体中添加了颜色,默认新增节点为红色。

这时候平衡就需要看叔叔节点,也就是父亲节点的兄弟。

我们以右旋为例,父亲在爷爷的左边,当父亲节点存在且为红时,进入场景

场景一:叔叔存在且为红 -- 变色

把父亲和叔叔变黑,爷爷变红,孩子变爷爷,继续往上直到根节点,注意最后根节点变黑。

【C++】二叉搜索树之--红黑树_第1张图片

场景二:叔叔不存在或者存在且为黑色,孩子在父亲的左边 -- 右单旋

爷爷节点右旋下来,父亲变黑,爷爷变红。

【C++】二叉搜索树之--红黑树_第2张图片

场景三:叔叔不存在或者存在且为黑色,孩子在父亲的右边 -- 左右双旋

父亲先左旋,然后到爷爷右旋,爷爷变红,孩子变黑。

【C++】二叉搜索树之--红黑树_第3张图片

方向相反的则反之。

可以观察到,每条路径的黑色节点数目都是相等的。

红黑树与AVL树的比较:

        红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O( logN),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。

你可能感兴趣的:(C++,c++)