二叉排序树又称二叉查找树或二叉搜索树。 它一棵空树或者是具有下列性质:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
查找的时候总是从根节点进行比较然后逐级往下进行。
由于它是一种树形结构,所以相对于顺序存储结构来说,进行插入或者删除操作的时候效率较高,但是其查找性能是是不确定的(依赖于书的形状),例如如果每个节点都只有左孩子而没有右,则查找相当于从头找到尾,而如果每个节点的左右孩子深度差不多相等,则相当于二分查找。
鉴于上述原因,则需要在构造树的形状时尽量左右平衡,以提高查找效率,所以就出现了平衡二叉树(AVL树)
平衡二叉树或为空树,或为如下性质的二叉排序树:
(1)左右子树深度之差的绝对值不超过1;
(2)左右子树仍然为平衡二叉树.
平衡因子BF=左子树深度-右子树深度.
平衡二叉树每个结点的平衡因子只能是1,0,-1。若其绝对值超过1,则该二叉排序树就是不平衡的。
最小不平衡子树:距离插入结点最近,且平衡因子的绝对值大于1的结点为根的子树。
平衡二叉树的构造思想:
构建的过程中,每插入一个结点,先检查是否因为插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树的前提下,调整最小不平衡子树中各个结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
程序的具体实现方法可以参见《大话数据结构》一书