一 平衡二叉树的引入
1 二叉排序树存在的问题
有一个数列{1,2,3,4,5,6}, 创建一颗二叉排序树(BST), 分析它存在的问题。
2 上边 BST 存在的问题
a 左子树全部为空,从形式上看,它更像一个单链表。
b 插入速度没有影响。
c 查询速度明显降低,因为需要依次比较,该树不能发挥 BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢。
3 解决方案-平衡二叉树(AVL)
平衡二叉树具有以下特点:
a 平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树,可以保证查询效率较高。
b 具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。
4 下面哪些树是 AVL 树
第1棵和第2棵是AVL树,第3棵树不是AVL树。
二 二叉排序树转化为AVL树的算法——单旋转(左旋转)
1 要求
有一个数列{4,3,6,5,7,8}, 创建出对应的平衡二叉树。
2 算法
原始的平衡二叉树如下。
a 创建一个新的节点 newNode(以4这个值创建),创建一个新节点,节点的值等于当前根节点的值。
b 把新节点的左子树设置为当前节点的左子树。
c 把新节点的右子树设置为当前节点右子树的左子树。
d 把当前节点的值设置为右子节点的值。
e 把当前节点的右子树设置为右子树的右子树。
f 把当前节点的左子树设置为新节点
g 稍微整理一下上图,就形成了新的平衡二叉树,它是符合平衡二叉树的特征。
三 实战
1 需求:
一个数列{4,3,6,5,7,8},创建出对应的平衡二叉树。
2 代码
/**
* @className: AVLTreeDemo
* @description: 平衡二叉树
* @date: 2021/3/27
* @author: cakin
*/
public class AVLTreeDemo {
/**
* 功能描述:平衡二叉树测试
*
* @pa