二叉树
只有两个子节点的树称为二叉树
二叉搜索树
即左子节点小于当前节点,且当前节点小于右子节点
平衡二叉树
1. 为什么需要平衡二叉树
当二叉搜索树只有左子树或者只有右子树时,二叉搜索树会退化为链表,时间复杂度降为O(n),为了解决设计了平衡二叉树
2. 什么是平衡二叉树
也称AVl树,如果不是空树,任意节点的左子树和右子树都是平衡二叉树,且高度查不超过1
-
上图不是平衡二叉树
-
真正的平衡二叉树
3. 左旋和右旋
左旋如图
-
(1)节点的右孩子替代此节点位置
(2)右孩子的左子树变为该节点的右子树
(3)节点本身变为右孩子的左子树
右旋如图
-
(1)节点的左孩子替代此节点位置
(2)左孩子的右子树变为该节点的左子树
(3)节点本身变为有孩子的右子树
红黑树
1. 红黑树的特性:
它是一种特殊的平衡二叉树
(1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点! (4)如果一个节点是红色的,则它的子节点必须是黑色的。(并不是子节点都是黑色,父节点就一定是红色) (5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
红黑树示意图:
2. 红黑树应用
Java中的TreeSet和TreeMap都是用的红黑树
hashMap中当发生冲突时,使用链表进行存储,当链表中元素达到8且元素数量大于64时,采用红黑树。当红黑树中元素数量小于6时,使用链表存储;为了防止频繁转换数据结构带来的资源消耗
3. 左旋与右旋
-
左旋:以X为节点向左旋,即被旋转的节点将变为一个左节点
-
-
右旋:以x为节点向右旋,即被旋转的节点将变为一个右节点
4. 添加和删除
-
添加:先按照二叉搜索树的方式添加一个红色节点,添加节点后,很容易破坏红黑树的结构,通过旋转或着色等操作使之成为一个新的红黑树。
-
删除:同上