平衡二叉树


平衡二叉树的定义

平衡二叉树又称:Self-Balancing Binary Search Tree 或

Height-Balanced Binary Search Tree:高度平衡的二叉排序树。

平衡二叉树​:是一种二叉排序树,它的每一个节点的左子树和右子树的高度差小于等于一。

由两位俄罗斯数学家 ​G M Adelson-Velskii​ 和 ​E M Landis​,于1962年共同发明解决平衡二叉树的算法。也称这样的平衡二叉树为AVL树。

  1. 简单分析以下二叉树是不是平衡二叉树(AVL树)
    平衡二叉树 AVL树_平衡二叉树
    图1​满足排序(中序遍历:35 47 58 62 88 93 99)要求;但第二层58 88两节点的左右子树高度差的绝对值大于1。所以图1不是AVL树。
    图2​满足每个节点左右子树高度差小于等于1;但是不满足排序要求,59 大于 58节点;所以,它也不是AVL树。
    图3​满足排序要求;但是节点58的左子树高度为2,右子树高度为0;所以,它不是平衡二叉树。
    图4​即满足排序要求,也满足每个节点左右子树高度差小于1的条件。故它是平衡二叉树或AVL树。

最小不平衡子树

最小不平衡子树​:距离插入节点​最近的​,且平衡因子的绝对值大于1的节点​为根的子树​,就是最小不平衡子树。

比如:插入37时,58节点是距离它最近的平衡因子大于1的节点;那么,以58为根的子树,就是最小不平衡子树。

平衡二叉树 AVL树_插入节点_02

平衡二叉树的实现原理

平衡二叉树的实现原理​:平衡二叉树构建的思想是,每当插入节点时,先检查是否因为插入而破坏了树的平衡性,若是,则找出最小平衡树。在保持二叉排序树特性的条件下,调整最小不平衡树中各个节点之间的链接关系,进行旋转,使之成为新的平衡子树。

演示​:操作实现数组a[10]= [3,2,1,4,5,6,7,10,9,8]的二叉平衡树:

首先,向树中插入节点的同时记录各节点的平衡因子。

平衡因子=左子树的深度-右子树的深度,深度等于树的层数

出现平衡因子大于1时,调整旋转最小不平衡子树的节点。

平衡二叉树 AVL树_数据结构_03

插入节点1,节点3的平衡因子为2>1,调整整个子树右旋;插入节点4;

平衡二叉树 AVL树_子树_04

插入节点5,最近的3节点的平衡因子为-2,绝对值大于1.整个​节点3子树​左旋。

平衡二叉树 AVL树_二叉树_05

插入节点6,节点2的平衡因子为-2,整棵树是最小不平衡子树,左旋,4节点变成根,4的左子树变成节点2的右子树,达到平衡;

平衡二叉树 AVL树_插入节点_06

插入节点7,节点5的平衡因子为-2,最小不平衡子树左旋;插入节点10;

平衡二叉树 AVL树_插入节点_07

插入节点9;节点7不平衡,此时应该左旋,但是9<10不能是10的右节点;

通过观察,前面插入节点,单纯地左旋和右旋是因为子树树根和左右孩子的平衡因子符号一致。故在此处需要调整平衡因子符号一致。将10,9 节点右旋。

平衡二叉树 AVL树_数据结构_08

再将最小不平衡树左旋;插入节点8;

平衡二叉树 AVL树_子树_09

此时需要将6节点子树左旋,但节点9的平衡因子与节点6的符号不一致;将节点9子树右旋。

平衡二叉树 AVL树_插入节点_10

再将节点6子树左旋。

如此,便完成了一颗平衡二叉树的构建。

算法实现

此处不是省略,等待更新!!

参考文献

[1] 《大话数据结构》程杰 [M].