当前位置: 首页 > web >正文

数据结构 -- 树形查找(二)平衡二叉树

平衡二叉树

定义

平衡二叉树(AVL树) – 树上的任意一点的左子树和右子树的高度之差不超过1

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

平衡二叉树的结点的平衡因子的值只可能是-1、0、1

//平衡二叉树结点
typedef struct AVLNode{int key;		//数据域int balance;	//平衡因子struct AVLNode *lchild,*rchild;
}AVLNode,*AVLTree;
插入操作

在插入新结点后,如何保持平衡

从插入点往回找到第一个不平衡的结点,调整以该结点为根结点的子树

每次调整的对象都是“最小不平衡子树”

在这里插入图片描述

插入新结点后如何调整“不平衡”问题(重点 选择手算处理)

LL – 右单旋转(右旋)

在这里插入图片描述

RR – 左单旋转(左旋)

在这里插入图片描述

代码思路:

在这里插入图片描述

LR – 先左后右双旋转

在这里插入图片描述

RL – 先右后左双旋转

在这里插入图片描述

在这里插入图片描述

【思考】为什么只需要调整最小不平衡子树?

插入操作导致“最小不平衡子树”高度+1,经过调整之后高度恢复,从而其他祖先节点都会恢复平衡

查找效率分析

若树高为h,则最坏情况下,查找一个关键字最多需要对比h次,即查找操作的时间复杂度不肯超过O(h)

平衡二叉树 – 树上任一结点的左子树和右子树的高度之差不超过1

假设以nh表示深度为h的平衡树中含有的最少结点数

则有n0=0,n1=1,n2=2,并且有nh=n(h-1)+n(h-2)+1

hmax=O(log2n)

平衡二叉树的平均查找长度为O(log2n)

平衡二叉树的插入&删除

平衡二叉树的插入操作

​ 插入新结点后,要保持二叉排序树的特性不变

​ 若插入新结点导致不平衡,则需要调整平衡

平衡二叉树的删除操作

​ 删除新结点后,要保持二叉排序树的特性不变

​ 若删除结点导致不平衡,则需要调整平衡

具体步骤

①删除结点,方法同“二叉排序树”

在这里插入图片描述

②找最小不平衡子树(不存在则结束)

③在最小不平衡子树下,找到最高的儿子结点和孙子节点

在这里插入图片描述

④基于孙子结点的位置,调整平衡(LL/RR/LR/RL)

孙子 在LL:儿子右单旋转

孙子在RR:儿子左单旋转

孙子在LR:孙子先左旋后右旋

孙子在RL:孙子先右选后左旋

⑤如果不平衡向上传导,返回②

对最小不平衡子树的旋转可能导致树变矮从而导致上层祖先不平衡(不平衡只会向上传导)

平衡二叉树删除操作的时间复杂度=O(log2n)

http://www.xdnf.cn/news/7093.html

相关文章:

  • 【自然语言处理与大模型】向量数据库:Chroma使用指南
  • JAVA EE(进阶)_进阶的开端
  • 仿腾讯会议——退出房间
  • Linux概述:从内核到开源生态
  • DOM知识点
  • 2_Spring【IOC容器中获取组件Bean】
  • 计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统
  • 【25软考网工】第六章(7)网络安全防护系统
  • 入门OpenTelemetry——应用自动埋点
  • 20242817-李臻-课下测试:基于商用密码的数字信封协议(AI)
  • 基于 STM32 的手持式安检金属探测器设计与实现
  • AI大模型学习二十六、使用 Dify + awesome-digital-human-live2d + ollama + ChatTTS打造数字人
  • 图绘Linux:基础指令脉络阁
  • 学习黑客Active Directory 入门指南(二)
  • C语言:在 Win 10 上,gcc 如何编译 调用 Tcl/Tk 的C程序
  • Jmeter使用及压测
  • Linux下 使用 SSH 完成 Git 绑定 GitHub
  • 【Linux】ELF与动静态库的“暗黑兵法”:程序是如何跑起来的?
  • 什么是迁移学习(Transfer Learning)?
  • .NET外挂系列:1. harmony 基本原理和骨架分析
  • GitHub 趋势日报 (2025年05月17日)
  • 【C++】unordered_map与set的模拟实现
  • 45 python csv(存储表格数据)
  • Day28 Python打卡训练营
  • 赋能企业级移动应用 CFCA FIDO+提升安全与体验
  • 题单:递归求和
  • 上集:一个前端的血泪复仇记 —— 静态部署的胜利
  • java每日精进 5.15【分页实现】
  • C语言斐波那契数列
  • 日期数据渲染转换问题