赞
踩
之前我们已经学了数组和链表。它们是 Arraylist 和 LinkedList 的底层结构。

这是一个普通二叉树。
注意别的节点也可以有子树


由于普通二叉树排序无规律,查找数据时效率慢,
因此有了二叉查找树(又称二叉排序树或者二叉搜索树)

特点:

从根节点开始,然后按照当前节点,左子节点,右子节点的顺序遍历
从最左边的子节点开始,然后按照左子结点,当前结点,右子结点的顺序遍历
左子节点–>右子结点 --> 当前节点
举例:

一层一层的去遍历
查找二叉树的弊端:可能出现长短腿的情况,退化成链表了
这时就有了平衡二叉树:

前提是二叉查找树
- 任意节点 左右子树 高度差不超过1
下面这个二叉树就违背了规则


平衡二叉树的旋转级制:
- 左旋
- 右旋
**触发时机:**当添加一个节点后,该树不再是一颗平衡二叉树
步骤:


如:当添加 12 后不再是平衡二叉树 向上找到不平衡节点 10(右子树高 2,左子树高 0,高差超过 1) 将 10 作为支点,左旋完得:



特殊情况:
步骤:


此时 7 为不平衡节点,将其作为支点左旋


步骤:


如:添加 1 后为不平衡, 先找到不平衡点 4, 作为支点右旋


特殊情况:
步骤:


添加完 1 后不平衡,7 为不平衡点,并作为支点,右旋,


**触发时机:**当添加一个节点后,该树不再是一颗平衡二叉树 又具体分为以下几种:
左左:一次右旋解决
左右:先局部左旋,再找支点右旋
右右:一次左旋解决
右左:先局部右旋 ,再找支点左旋

根节点的左子树

根节点的左子树得左子树

此时添加 1,不平衡了

此时 7 是不平衡点,作为支点,右旋

得:


我们在根节点左子树的右子树上添加 6

先不找平衡点,先将局部左旋


再整体右旋得:



7 为不平衡点,作为支点,直接左旋得



先局部右旋:得

再找平衡点 7,作为支点,左旋得:


为什么要有红黑树?
频繁的旋转操作使平衡二叉树的性能大打折扣

和平衡二叉树的区别:

引用:
Nil:NIL节点也称为外部节点或空节点,NIL节点不存储实际的数据,如果一个节点没有左子节点或右子节点,那么它的对应子节点就是一个NIL节点。通过将红黑树的所有叶子节点都替换为NIL节点,我们可以保证红黑树的每个节点都至少有一个子节点。这样,我们就可以通过判断节点的子节点是否为NIL节点来处理边界情况,避免了在处理节点时需要特殊处理叶子节点的情况。
如 17->15>Nil 和 17->25->22->Nil 均为两个黑色节点

下面这个就违背了规则 5


如,
若添加黑色 值为 18 的节点,就违背了规则 5

若:
添加 红色 18 节点,直接可构成红黑树



红黑树增删改查的性能都很好
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。