平衡二叉树

91 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

平衡二叉树

根据数列 {1,2,3,4,5,6},创建一个二叉排序树(BSL)

image-20220918151718383

左边(BSL)==存在问题==分析

  1. 左子树全部为空,从形式上看,更像一个单链表
  2. 插入速度没有影响
  3. 查询速度明显降低(因为需要依次比较), 不能发挥BST 的优势,因为每次还需要比较左子树,其查询速度比 单链表还慢
  4. 平衡二叉树(AVL)

基本介绍

别名:平衡二叉搜索树(Self-balancing binary search tree),AVL树

==保证查询效率较高==

满足二叉排序树

特点

  • AVL是一 棵空树或左右两个子树的==高度差的====绝对值不超过1==,且左右两个子树都是一棵平衡二叉树

  • 常用实现方法

    1. 红黑树
    2. AVL
    3. 替罪羊树
    4. Treap (横二叉树)
    5. 伸展树

平衡二叉树 - 单旋转(左旋转)

根据数列 {4,3,6,5,7,8},创建出对应的平衡二叉树

结点的左旋转

  1. 将 A 节点的 右节点 的 左节点 ,指向 A节点
  2. 将 A 节点的右节点,指向 A 节点的右节点的左节点

左旋转原因

  • 右子树高度比左子树高度 高 并且高度差绝对值大于1

左旋转目的

  • 降低右子树高度

AVL树高度求解

  • 总的高度
  • 右子树高度
  • 左子树高度

代码分析

  1. 创建一个新结点newNode,值为当前根节点值

  2. 将新节点的左子树设置为当前节点的左子树

    newNode.left = left

  3. 将新节点的右子树设置为当前节点的右子树的左子树

    newNode.right= right.left

  4. 将当前节点的值为右子节点的值

    value = right.value

  5. 将当前节点的右子树设置为右子树的右子树

    right = right .right

  6. 将当前节点的左子树设置为新节点

    left = newNode