平衡二叉树

简介: 前面我写了一篇二叉排序树,最后我们提到提高二叉排序树的查找效率是让二叉树的形状均衡,所以就引入了平衡二叉树。特点:一种特殊类型的二叉排序树所有结点的左、右子树深度之差的绝对值≤1左右子树是平衡二叉树;平衡因子:该结点左子树和右子数的高度差任意一个结点的平衡因子只能取:-1、0或1;如果树中任意一个结点的平衡因子的绝对值大于1,则这棵二叉树就失去平衡,不再是AVL树;对于一棵有n个结点的AVL树,其高度保持在O(log2n)数量级,ASL也保持在O(log2n)量级。

前面我写了一篇二叉排序树,最后我们提到提高二叉排序树的查找效率是让二叉树的形状均衡,所以就引入了平衡二叉树。

特点:

  • 一种特殊类型的二叉排序树

  • 所有结点的左、右子树深度之差的绝对值≤1

  • 左右子树是平衡二叉树;

平衡因子:该结点左子树和右子数的高度差

任意一个结点的平衡因子只能取:-1、0或1;如果树中任意一个结点的平衡因子的绝对值大于1,则这棵二叉树就失去平衡,不再是AVL树;

对于一棵有n个结点的AVL树,其高度保持在O(log2n)数量级,ASL也保持在O(log2n)量级。

这里写图片描述

如果在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,使之恢复平衡。我们称调整平衡过程为平衡旋转

调整方法:找到最小不平衡子树,可将重新平衡的范围局限于这棵子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各个结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。

最小不平衡子树:离插入结点最近且平衡因子绝对值超过1的祖先结点,以该结点为根的子树称为最小不平衡子树。

假设最小不平衡子树的根结点为A,则失去平衡后进行调整的规律可归纳为以下四种情况。

  • LL平衡旋转

  • RR平衡旋转

  • LR平衡旋转

  • RL平衡旋转

1)LL平衡旋转:

若在A的左子树的左子树插入结点,使A的平衡因子从1增加到2,需要进行一次向右顺时针旋转(以B为旋转轴)
这里写图片描述

这里写图片描述

2)RR平衡旋转:

若在A的右子树上插入结点,使A的平衡因子从-1
增加至-2,需要进行一次逆时针旋转(以B为旋转轴)

这里写图片描述

这里写图片描述

3)LR平衡旋转:

若在A的左子树的右子树上插入结点,使A的平衡因子从1增加到2,需要先进行逆时针旋转,再顺时针旋转。(以插入的结点

相关文章
|
4月前
|
存储 C++
二叉树搜索树的应用
二叉树搜索树的应用
32 1
|
3月前
|
C++
平衡二叉树(C++)
平衡二叉树(C++)
17 1
二叉搜索树之AVL树
二叉搜索树之AVL树
|
8月前
|
算法
平衡二叉树(AVL树)
平衡二叉树(AVL树)
50 0
|
9月前
|
存储 算法 关系型数据库
有了二叉树,平衡二叉树为什么还需要红黑树
有了二叉树,平衡二叉树为什么还需要红黑树
62 0
有了二叉树,平衡二叉树为什么还需要红黑树
|
10月前
|
算法
二叉搜索树、平衡二叉树
一、二叉搜索树 这里我们不用太多书面化的语言来定义,笔者认为在讨论数据结构、算法相关的内容时用太多书面化、学术化的语言是一种让人很烦的事情。咬文嚼字,不便于读者理解。 简单来说二叉树搜索树,其实就是用来做二分查找的一种二叉树。 特点是:根节点的左子树值均小于根节点的值,根节点的右子树值均大于根节点的值。 比如123 4 567建树的结果就是
37 0
|
11月前
平衡二叉树的实现
平衡二叉树的实现
|
JavaScript 前端开发 Java
搜索二叉树、完全二叉树、满二叉树、平衡二叉树
搜索二叉树、完全二叉树、满二叉树、平衡二叉树
103 0
二叉树、平衡二叉树AVL、红黑树、B树、B+树
B树的阶数等于叶节点最大关键字数量+1(因为关键字两边都有指向子节点的指针-分叉) 在m阶(m叉)B树中除根结点外,任何节点至少[m/2]个分叉,即至少[m/2]-1个关键字, [ ]代表向上取整。 节点内的关键字采用顺序查找或二分查找。 因为关键字太少会导致树变高,降低查找效率。另外就是保证同级子树的高度相同-平衡。