简介
平衡二叉树, 是由普通二叉树, 二叉查找树根据元素插入规则和保持左右子树平衡的旋转规则而来,本文只简单介绍这三种树的区别和联系;
二叉树
节点:
- 一个树只有一个根节点;
- 一个节点存储, 节点值, 父节点地址, 右子节点地址, 左子节点地址;
二叉树唯一的规则就是每个节点的度必须小于等于2, 何为度: 树结构中每个节点的子节点个数称之为 度, 还有一个树的高度,
也就是这个树的总层数;
二叉树只要保证每个节点的度<=2即可, 对于元素的插入规则是没有要求的;
二叉查找树
查找一词, 说明二叉查找树的查找效率很高, 至少比普通二叉树的查找效率高,毕竟它不是胡乱插入节点的;
二叉查找树的插入规则:
- 节点值相同不插入
- 节点值大于比较节点值,插入到比较节点的右边(如果右边有节点存在, 继续重复比较);
- 节点值小于比较节点值,插入到比较节点的左边(如果左边有节点存在, 继续重复比较);
上图就展示了二叉查找树的节点插入规则;
但是我们发现一个问题, 插入完成之后, 二叉查找树变得非常不平衡;
根节点的左右子树的高度非常不平衡: 让我们来优化一下:
我们这里使用了一些规则,让二叉查找树变成了如上图所示排列方式:
现在我问一个问题, 我需要查找节点值为2的节点, 原始的二叉查找树和平衡过后的二叉查找树, 谁要快写呢:
原始的: 7 > 5 > 4 > 2 : 一共比较了4次找到了2节点;
平衡的: 5 > 4 > 2; 一共比较了3次找到了2节点;
根据比较, 平衡的二叉树只比原始的减少了一次比较, 并没有很大的提升. 但是注意, 我们的树很低, 如果树高1万层呢? 平衡树和原始树在树的高度上会相差很大, 从而原始树的查找次数也会增大, 时间复杂度和链表的O(n)一样.
平衡二叉查找树
在规则上, 平衡树在二叉查找树上增加了一条: 每个节点的左右子树的高度差<= 1; 如果超过, 就必须按照旋转规则, 将树维持平衡;
旋转规则
左旋: 以某个节点为轴, 向左旋转
右旋: 以某个节点为轴, 向右旋转
左左
根节点的左子树的左子树有节点插入时, 导致二叉树不平衡, 直接右旋解决;
此时根节点的左右子树高度差值为2, 以根节点为轴, 右旋;
此时7节点降级, 当前根节点的右子节点5作为降级根节点的左子节点;
左右
在根节点的的左子树的右子树有节点插入的情况;
上图中1节点有误, 视为6节点即可:
以左子树的根节点为轴局部左旋:
然后以根节点为轴局部右旋:
此时7节点降级, 当前根节点的右子节点6作为降级根节点的左子节点;
右右
在根节点的右子树的右子树有节点插入时;
以根节点左旋即可
右左
在根节点的右子树的左子树有节点插入时
根节点右子树右旋, 根节点整体左旋;