数据结构--平衡二叉树

平衡二叉树

回顾:二叉排序树的查找

image-20230719100259822

二叉排序树的不平衡会影响查找效率,所有我们要尽量让二叉树的形态均衡.

image-20230719100344123

AVL树(平衡二叉树)

  1. 必须是二叉排序树

  2. 左子树和右子树的高度之差的绝对值小于等于1

  3. 左子树和右子树也是平衡二叉排序树

    平衡因子

    该结点左子树与右子树的高度差.

    平衡因子=结点左子树的高度-结点右子树的高度

image-20230719101112497

判断平衡二叉树

image-20230719101403811

对于一个右n个结点的AVL树,其高度保持再O(logn)数量级,ASLA也保持在O(logn)量级.

平衡调整办法1

有可能导致失衡,即出现平衡因子大于1的结点

如果在一颗AVLA树中插入一个新结点后造成失衡,则必须重新调整树的结构,让其恢复平衡

image-20230719104448242

平衡调整的四种类型

A:失衡结点 不止一个失衡结点时,为最小失衡子树的结点

B:A结点的孩子,C结点的双亲.

C:插入新节点的子树.

image-20230719104906630

调整原则:

  1. 降低高度
  2. 保持二叉排序树性质

image-20230719105432457

LL型

1. B结点带左子树α一起上升
2. A结点成为B的右孩子
3. 原来B结点的右子树β作为A的左子树

image-20230720095946962

image-20230720100029840

LL型例题

image-20230720100231575

RR型调整

1. B结点带右子树β一起上升
2. A结点成为B的左孩子
3. 原来B结点的左子树α作为A的右子树

image-20230720100407649

image-20230720100621737

RR型例子

image-20230720100800373

image-20230720100950606

LR型调整

C是最小的所以要上升

1. C结点穿过A、B结点上升
2. B结点成为C的左孩子,
3. A结点成为C的右孩子
4. 原来C结点的左子树β作为B的右子树;
5. 原来C结点的右子树y作为A的左子树

image-20230720101116284

image-20230720101437693

LR型例题

image-20230720101659312

RL型调整

C最小所以C做为根结点

1. C结点穿过A、B结点上升

2. A结点作为C结点的左孩子

3. B结点作为C结点的右孩子

4. 原来C结点的左子树β作为A的右子树;
5. 原来C结点的右子树y作为B的左子树


image-20230720101842273

RL型例子

image-20230720102115893

image-20230720102205068

平衡二叉树的调整例题

插入7 进行LR型调整

image-20230720105618185

插入9 进行LL型调整

image-20230720105834572

插入26 进行RR调整

image-20230720110038516

插入18 进行RL调整

image-20230720110139233

插入14

image-20230720110230167

插入15 进行LR调整,调整最小失衡的子树

image-20230720110448081

AVL树构造完毕

posted @   harper886  阅读(71)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示