平衡二叉树 AVL树

平衡二叉树的定义

平衡二叉树又称:Self-Balancing Binary Search Tree 或
Height-Balanced Binary Search Tree:高度平衡的二叉排序树。
平衡二叉树:是一种二叉排序树,它的每一个节点的左子树和右子树的高度差小于等于一。
由两位俄罗斯数学家 G M Adelson-VelskiiE M Landis,于1962年共同发明解决平衡二叉树的算法。也称这样的平衡二叉树为AVL树。

  1. 简单分析以下二叉树是不是平衡二叉树(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为根的子树,就是最小不平衡子树。
在这里插入图片描述

平衡二叉树的实现原理

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

演示:操作实现数组a[10]= [3,2,1,4,5,6,7,10,9,8]的二叉平衡树:
首先,向树中插入节点的同时记录各节点的平衡因子。
平衡因子=左子树的深度-右子树的深度,深度等于树的层数
出现平衡因子大于1时,调整旋转最小不平衡子树的节点。
在这里插入图片描述
插入节点1,节点3的平衡因子为2>1,调整整个子树右旋;插入节点4;
在这里插入图片描述
插入节点5,最近的3节点的平衡因子为-2,绝对值大于1.整个节点3子树左旋。
在这里插入图片描述
插入节点6,节点2的平衡因子为-2,整棵树是最小不平衡子树,左旋,4节点变成根,4的左子树变成节点2的右子树,达到平衡;
在这里插入图片描述
插入节点7,节点5的平衡因子为-2,最小不平衡子树左旋;插入节点10;
在这里插入图片描述
插入节点9;节点7不平衡,此时应该左旋,但是9<10不能是10的右节点;
通过观察,前面插入节点,单纯地左旋和右旋是因为子树树根和左右孩子的平衡因子符号一致。故在此处需要调整平衡因子符号一致。将10,9 节点右旋。
在这里插入图片描述
再将最小不平衡树左旋;插入节点8;
在这里插入图片描述
此时需要将6节点子树左旋,但节点9的平衡因子与节点6的符号不一致;将节点9子树右旋。
在这里插入图片描述
再将节点6子树左旋。
如此,便完成了一颗平衡二叉树的构建。

算法实现

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

参考文献

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

猜你喜欢

转载自blog.csdn.net/beauthy/article/details/105578056