二叉树
- 每个节点最多有两个子节点。
- 比根节点大的放右边,比根节点小的放左边。
二叉树的问题
二叉树容易导致像一边偏(左偏或者右偏)导致查找性能变差,偏的多了就变成线性查找了。
在此基础上就诞生了红黑树。
红黑树
功能 :将树变的矮矮胖胖的
红黑 只是一个标签,用来适配红黑树的规则(规则规定的是 红和黑)。。元素本身没有特别的地方。利用红黑树的规则进行插入元素可以使树的结构矮矮胖胖。
5 条规则
- 1 根节点必须为黑(就是这么规定的)
- 2 节点非红即黑
- 3 所有的叶子节点,全部都用黑的null填充
- 4 任意一个节点到其所有的叶子节点之间经过的黑节点相同(重要)
- 5 红节点的两个子节点为全黑(重要)
插入元素
插入的过程无非一下5种情况
- 什么都没有,插入的元素即为根节点,直接涂黑即可
- 只有一个根节点,新添加节点直接涂红即可(规则4)
- 父节点为黑,不影响,直接插入即可
规则死记硬背,很费劲,清楚规则以后就简单多了
除了以上两种简单情况,多余无非下面 以下几种情况
- 父和叔叔都为红 我们记为情况1—父叔皆红
- 父亲为红叔叔为黑,父亲是祖父的右节点 记为情况2----父红叔黑右
- 父亲为红叔叔为黑,父亲是祖父的左节点 记为情况3----父红叔黑左
解决的操作无非以下几种方式
- 变色
- 左旋
- 右旋
上面三种情况分别对应的解决方式为(对着冲突的地方进行操作)
-
父叔皆红 ------变色->左旋->右旋->根节点涂黑
-
父红叔黑右 ------ 左旋->右旋->根节点涂黑
-
父红叔黑左 ------ 右旋->根节点涂黑
总结
经历了情况1 必然会经历情况2 和情况3 只需要根据对应情况做对应操作即可。。
可见一次插入操作最多只会旋转两次。变色最多也是两次
红黑二叉树的查找,和插入的时间复杂度,因为属于二分查找都为O(logN)
普通的二叉树在最坏的情况下(全偏向一边) 时间复杂度为 O(n)
附上原文地址,,讲的很好。图我也是直接截取过来的
https://www.cnblogs.com/ysocean/p/8004211.html#_label3