目录
AVL树就是平衡二叉搜索树,说它是平衡的,主要是因为N次插入操作后,除叶节点外,任何一个节点的左右子树的高度不会大于1,注意是左子树和右子树的高度差。说它是搜索树是因为任何一个非叶节点的值比它的左儿子节点的值大,比它右儿子节点的值小。搜索的时间复杂度就是树的高度。有多变态?一颗三十层的AVL树如果放满的话总共有2的30次方减1这么多个节点,大约是十亿多(1,073,741,824)。在这么多节点中查找一个已在树的节点,最多找30次。那么AVL树是如何保证这么快的查找效率呢?这就得从调整树的平衡性来说起。
调整平衡的方法总共有四种,分别是单左旋,单右旋,左右双旋,右左双旋。这四种旋转方式在什么情况下使用,我们来看:
1. 单左旋
需要单左旋的情形是新插入的节点是放在某个节点右子树的右子树上,比如图中的1号节点,那么1号节点就失去平衡。因为1号节点左子树为空,高度为0,右子树不为空高度为2,高度差大于1,左旋后就是箭头右面的样子。
2. 单右旋
需要单右旋的情形是新插入的节点是放在某个节点左子树的左子树上,比如图中的6号节点,那么6号节点就失去平衡。因为6号节点右子树为空,高度为0,左子树不为空高度为2,高度差大于1,右旋后就是箭头右面的样子。
3.左右双旋
需要左右双旋的情形是新插入的节点是放在某个节点左子树的右子树上,比如图中的6号节点,那么6号节点就失去平衡。因为6号节点右子树为空,高度为0,左子树不为空高度为2,高度差大于1,那么对6号节点的左子树先进行左旋,得到中间的树。然后再对整棵树进行右旋,得到最右面的平衡树。
4.右左双旋
需要右左双旋的情形是新插入的节点是放在某个节点右子树的左子树上,比如图中的6号节点,那么6号节点就失去平衡。因为6号节点左子树为空,高度为0,右子树不为空高度为2,高度差大于1,那么对6号节点的右子树先进行右旋,得到中间的树。然后再对整棵树进行左旋,得到最右面的平衡树。