红黑树一种很难的数据结构
很少考察插入,和删除的细节
如果碰到让手写红黑树的面试官,直接告辞
通常考察对红黑树的理解程度
更多考察的是为什么有了搜索二叉查找树,还要平衡二叉树,为什么又了平衡二叉树,还要红黑树?
介绍下二叉查找树:左子树节点值比父节点值小,右子树节点值比父节点值大。
基于二叉树的这个特点,在查找某个节点的时候,可以采用类似于二分查找的思想,快速找到某个节点。
n个节点的二叉查找树,正常情况下,查找的时间复杂度为O(log n).
但在极端的情况下,二叉查找树,可能退化为一条链表,查找的效率会退化为O (n)
为了解决以上问题,引申出了平衡二叉树。平衡二叉树就是为了解决二叉搜索树在极端情况下退化成链表的情况而诞生。
平衡二叉树的特点:1.具有二叉搜索树的全部特点;2.每个节点的左子树和右子树的高度差至多为1.
平衡二叉树基于这种特点就可以保证不会出现大量节点偏向一边的情况
于是通过平衡二叉树,我们解决了二叉树的缺点。
对于有n个节点的平衡树,最坏的查找时间复杂度也为O (log n )
为什么有了平衡二叉树,还需要红黑树?
虽然平衡二叉树解决了二叉查找树退化为链表的缺点,能够把查找的时间控制在O (log n),不过不是最佳的。
因为平衡二叉树要求每个节点的左子树和右子树的高度相差最多等于1,这个要求实在太严格了,导致每次插入/删除节点的时候,几乎都会破坏平衡树的第二规则。进而我们都需要通过左旋和右旋来进行调整,使之再次成为一棵符合要求的平衡树。
显然,在插入和删除比较平凡的场景中,平衡树需要频繁的进行调整,这会使平衡树的性能大打折扣,为了解决这个问题,于是就有了红黑树。
红黑树的特点:
具有二叉查找树的特点。
根节点是黑色的。
每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存数据
任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的。
每个节点,从该节点到达其可达的叶子节点的所有路径,都包含相同数目的黑色节点。
正是由于红黑树的这种特点,使得它能够在最坏情况下,也能在 O(logn) 的时间复杂度查找到某个节点。至于为什么就能够保证时间复杂度为 O(logn),至于具体细节,自行补充红黑树知识。
不过,与平衡树不同的是,红黑树在插入、删除等操作,不会像平衡树那样,频繁着破坏红黑树的规则,所以不需要频繁着调整,这也是我们为什么大多数情况下使用红黑树的原因。
不过,如果你要说,单单在查找方面的效率的话,平衡树比红黑树快。
所以,我们也可以说,红黑树是一种不大严格的平衡树。也可以说是一个折中发方案。
总结:
所以,最后的答案是,平衡树是为了解决二叉查找树退化为链表的情况,而红黑树是为了解决平衡树在插入、删除等操作需要频繁调整的情况。
问题扩展:
红黑树的使用场景?HashMap,TreeMap 内部结构用到了红黑树。
构建一棵节点个数为 n 的红黑树,时间复杂度是多少?
红黑树与哈希表在不同应该场景的选择?
红黑树有哪些性质?
红黑树各种操作的时间复杂度是多少?