二叉树、二叉查找树、平衡树和红黑树概念

二叉树?

二叉树(Binary Tree)是指每个节点最多只有两个分支的树结构(即不存在分支大于 2 的节点),如下图所示:

这是一棵拥有 6 个节点深度为 2(深度从 0 开始),并且根节点为 3 的二叉树。二叉树的左右两个分支通常被称作“左子树”和“右子树”,而且这些分支左右次序不能随意地颠倒。

二叉查找树?

一棵空树或者满足以下性质的二叉树被称之为二叉查找树(Binary Search Tree)也被称为二叉搜索树、有序二叉树(Ordered Binary Tree)或排序二叉树(Sorted Binary Tree)等。

(1)如果任意节点的左子树不为空,并且左子树上所有节点的值均小于它的根节点的值;

(2)如果任意节点的右子树不为空,并且右子树上所有节点的值均大于或等于它的根节点的值;

(3)任意节点的左、右子树分别为二叉查找树。

标准的二叉查找树:

平衡树?

所谓的平衡树是指一种改进的二叉查找树,顾名思义平衡树就是将二叉查找树平衡均匀地分布,这样的好处就是可以减少二叉查找树的深度

一般情况下二叉查找树的查询复杂度取决于目标节点到树根的距离(即深度),当节点的深度普遍较大时,查询的平均复杂度就会上升,因此为了实现更高效的查询就有了平衡树。

非平衡二叉树(左)和平衡二叉树(右)如下图所示:

 

可以看出使用平衡二叉树可以有效的减少二叉树的深度,从而提高了查询的效率

红黑树?

红黑树除了具备二叉查找树的基本特性之外,还具备以下特性:

(1)    节点是红色或黑色;

(2)    根节点是黑色;

(3)    所有叶子都是黑色的空节点(NIL 节点);

(4)    每个红色节点必须有两个黑色的子节点,也就是说从每个叶子到根的所有路径上,不能有两个连续的红色节点;

(5)    从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑色节点。

红黑树结构如下图所示:

红黑树的优势?

红黑树的优势在于它是一个平衡二叉查找树,对于普通的二叉查找树(非平衡二叉查找树)在极端情况下可能会退化为链表的结构,例如,当我们依次插入 3、4、5、6、7、8 这些数据时,二叉树会退化为如下链表结构:

 

当二叉查找树退化为链表数据结构后,再进行元素的添加、删除以及查询时,它的时间复杂度就会退化为 O(n);而如果使用红黑树的话,它就会将以上数据转化为平衡二叉查找树,这样就可以更加高效的添加、删除以及查询数据了,这就是红黑树的优势。红黑树的高度近似 log2n,它的添加、删除以及查询数据的时间复杂度为 O(logn)

自平衡的红黑树

红黑树能够实现自平衡和保持红黑树特征的主要手段是:变色、左旋和右旋。

左旋

左旋指的是围绕某个节点向左旋转,也就是逆时针旋转某个节点,使得父节点被自己的右子节点所替代,如下图所示:

 

在 TreeMap 源码中左旋的实现源码如下:

 左旋代码说明:在刚开始时,p 为父节点,r 为子节点,在左旋操作后,r 节点代替 p 节点的位置,p 节点成为 r 节点的左孩子,而 r 节点的左孩子成为 p 节点的右孩子。

右旋

右旋指的是围绕某个节点向右旋转,也就是顺时针旋转某个节点,此时父节点会被自己的左子节点取代,如下图所示:

在 TreeMap 源码中右旋的实现源码如下:

右旋代码说明:在刚开始时,p 为父节点 l 为子节点,在右旋操作后,l 节点代替 p 节点,p 节点成为 l 节点的右孩子,l 节点的右孩子成为 p 节点的左孩子。、

变色

对于红黑树来说,如果当前节点的左、右子节点均为红色时,因为需要满足红黑树定义的第四条特征(每个红色节点必须有两个黑色的子节点),所以需要执行变色操作,如下图所示

常见面试题

(1)    红黑树和二叉树有什么区别?

(2)    为什么工程中喜欢使用红黑树而不是其他二叉查找树(优势?)?

(3)    红黑树是如何保证自平衡的?

 

posted @ 2020-11-08 17:08  JustJavaIt  阅读(1612)  评论(0编辑  收藏  举报