平衡二叉树定义(AVL树)
平衡二叉树是在二叉排序树(BST)上引入的,就是为了解决二叉排序树的不平衡性,而不平衡性又是时间复杂度增大的主要原因。
例如:数组a=[12,24,37,45,53,93]建立二叉排序树为下图所示。左图为平衡二叉树,右图为二叉排序树。
图1
由上图可知,当你进行查找时,右图的平均查找时间高于左图。
所以AVL树在查找方面性能就保持了BST的最好时间复杂度O(logn)。
平衡二叉树或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。
在对树进行旋转操作时,我们需要了解几点概念:
1.最小不平衡子树:指离插入节点最近且以平衡因子的绝对值大于1的节点作为根的子树。
例如:
图2
左边的图是平衡二叉树,但是当此时插入键为20的节点,会形成右图这种不平衡二叉树。键为80的左右子树的深度之差为2,所以80的左子树就是最小不平衡子树,而80就是最小不平衡子树的根节点。
2.平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1;
例如:图2的左图,节点80的左子树深度为3,右子树深度为1,所以左右子树的深度差为2。
插入操作:
在平衡二叉树中插入结点与二叉查找树最大的不同在于要随时保证插入后整棵二叉树是平衡的。那么调整不平衡树的基本方法就是: 旋转,基本思路都是转换到左旋和右旋。
(1)右旋:节点插入在最小不平衡节点的左子树的左子树上。此时以最小不平衡子树的根节点为旋转节点,进行右旋。
(2)左旋: 节点插入在最小不平衡节点的右子树的右子树上。此时以最小不平衡子树的根节点为旋转节点,进行左旋。
(3)右左:节点插入在最小不平衡节点的左子树的右子树上面。以最小不平衡节点进行右旋,再以最小不平衡子树的根节点左旋。
(4)左右:节点插入在最小不平衡节点的左子树的右子树上面。以最小不平衡节点进行左旋,再以最小不平衡子树的根节点右旋。
总结:
左旋:逆时针旋转;旋转节点的右节点代替自己位置,自己成为右节点的左子节点,右节点的左子节点成为旋转节点的右子节点。
右旋:顺时针旋转;旋转节点的左节点代替自己位置,自己成为左节点的右子节点,左节点的右子节点成为旋转节点的左子节点。
参考博客:
平衡二叉树的插入旋转
数据结构—平衡二叉树