第四章:树与二叉树(平衡二叉树)

1.平衡二叉树

平衡二叉树:AVL,任意结点的平衡因子的绝对值不超过一。

平衡因子:左子树高度 - 右子树高度

如上图二叉树,是否是平衡二叉树?

可以把所有结点的平衡因子计算出来,进行判断,可以看出此二叉树是平衡二叉树。

高度为h的最小(结点数最少)平衡二叉树的结点数Nh?

根据平衡二叉树 右侧那个结点的值可以选择:h、h-1和h-2,如果选择h,加上根节点1层,总层数为h+1,不符合题意。其中h-1和h-2都可以选择但是为什么选择h-2?是因为这里说的是最小平衡二叉树,h-1层结点数肯定比h-2层结点数多。N0=0(0层结点数为0)N1=1(结点数为1)

比如我们现在要计算高度为3的最小平衡二叉树的结点数。则:

N3=N2+N1+1; =》N2=N1+N0+1=2; =》N3=2+1+1=4;

1.1平衡二叉树的判断

利用递归的后序遍历过程:

· 判断左子树是一棵平衡二叉树

· 判断右子树是一棵平衡二叉树

· 判断以该结点为根的二叉树为平衡二叉树判断条件若左子树和右子树均为平衡二叉树且左子树与右子树高度差的绝对值小于等于1,则平衡。

根据判断条件我们知道,每个结点要保存两个变量:一个是该节点的平衡性(b:1平衡 0不平衡)另一个是该节点的高度(h)。

//参1 该棵树的根节点void Judge_AVL(BiTree bt,int &balance,int &h){ //左子树平衡性左子树高度 右子树平衡性右子树高度 int bl=0,br=0,hl=0,hr=0; if(bt==NULL){//如果根节点为空 h=0; //高度设为0 balance=1; //并且是平衡的 }else if(bt->lchild==NULL&&bt->rchild==NULL){ //左子树和右子树都为空 h=1; //高度为1 balance=1; //平衡的 }else{ Judge_AVL(bt->lchild,bl,hl); //判断左子树 Judge_AVL(bt->rchild,br,hr); //判断右子树 //下面计算该节点为根二叉树的高度 //首先判断哪个子树的高度高,然后加1即可 if(hl>hr){ h=hl+1; }else{ h=hr+1; } //判断平衡性 // abs 是取绝对值 if(abs(hl-hr)<2&&bl==1&&br==1){ balance=1; }else{ balance=0; } }}

2.平衡二叉树的插入

平衡二叉树的插入过程其实和二叉排序树的插入过程相比多了一步,如果按照二叉排序树的插入过程,所形成的二叉树不一定是平衡二叉树,所以我们需要先插入之后进行调整。即:先插入后调整。

调整原则每次调整最小不平衡子树

例如,如上图插入完成之后我们需要调整,我们调整是从插入结点开始,向上依次调整。首先4结点平衡因子为-1,符合平衡二叉树,然后向上6结点平衡因子为2,不符合平衡二叉树,则需要调整。

2.1LL平衡旋转(右单旋转)

出现不平衡的原因:在结点A的左孩子的左子树上插入了新结点。

调整方法:右旋操作:用A的左孩子B代替A,将A结点称为B的右子树根结点,而B的原右子树则作为A的左子树。

出现了不平衡的情况,下面调整成平衡二叉树:

2.2RR平衡旋转(左单旋转)

出现不平衡的原因:在结点A的右孩子的左子树上插入了新结点。

调整方法:左旋操作:用A的右孩子B代替A,将A结点称为B的左子树根结点,而B的原左子树则作为A的右子树。

2.2LR平衡旋转(先左后右双旋转)

出现不平衡的原因:在结点A的左孩子的右子树上插入了新结点。

调整方法:先左旋后右旋转操作:将A的左孩子B的右孩子结点C代替B,然后再将C结点向上代替A的位置。

注意:其中Cl和Cr也可能都为空,因为B的右子树Br可能为空。

2.2RL平衡旋转(先右后左双旋转)

出现不平衡的原因:在结点A的左孩子的左子树上插入了新结点。

调整方法:先右旋后左旋转操作:将A的右孩子B的左孩子结点C代替B,然后再将C结点向上代替A的位置。

关于数据结构的知识公众号 理木客 同步更新中,欢迎关注,下次将会讲解:树与二叉树的应用之哈夫曼树

带父节点的平衡二叉树_学习数据结构--第四章:树与二叉树(平衡二叉树)相关推荐

  1. 算法与数据结构 第四章 树与二叉树

    第四章树 一.选择题(20分) 1.在下述结论中,正确的是: (    ) ① 只有2个结点的树的度为1: ② 二叉树的度为2: ③ 二叉树的左右子树可任意交换: ④ 在最大堆(大顶堆)中,从根到任意 ...

  2. 王道408数据结构——第五章 树与二叉树

    文章目录 一.树的基本概念 树的性质 二.二叉树 满二叉树 完全二叉树 二叉排序树 平衡二叉树 二叉树的性质 完全二叉树的性质 三.二叉树的储存结构 顺序储存 链式存储 四.树的储存方式 双亲表示法 ...

  3. 王道数据结构课代表 - 考研数据结构 第五章 树和二叉树 究极精华总结笔记

    本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!!   关于对 树和二叉树 章节知识点总结的十分全面,涵括了<王道 ...

  4. 中根遍历二叉查找树所得序列一定是有序序列_学习数据结构--第六章:查找(查找)

    第六章:查找 1.查找的基本概念 查找:在数据集合中寻找满足某种条件的数据元素的过程. 查找的结果 查找成功和查找失败 查找表:用于查找的数据集合,由同一种数据类型(或记录)的组成,可以是一个数组或链 ...

  5. c++ 图的连通分量是什么_学习数据结构第五章:图(图的遍历操作)

    第五章:图(图的遍历操作) 1.图的遍历 图的遍历:从图中某一顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问依次且仅访问一次 其实树的层次遍历和图的广度优先搜索类似,可以把这个二叉树看成一 ...

  6. 假设以邻接矩阵作为图的存储结构_学习数据结构第五章:图(图的存储方法)...

    第五章:图(图的存储方法) 1.邻接矩阵法 下面是一个无向图的表示,我们使用一个一维数组存放点集,使用一个二维数组存放边集 二维数组表示边:行号表示其实端点,列号表示结束端点,值表示该边是否存在,以及 ...

  7. 数据结构 第5章 树和二叉树 课后答案

    第5章  树和二叉树 1.选择题 (1)把一棵树转换为二叉树后,这棵二叉树的形态是(   ). A.唯一的                          B.有多种 C.有多种,但根结点都没有左孩 ...

  8. 2021-08-30王道 数据结构 第5章 树与二叉树 p185 第10题

    第5章 树与二叉树 5.5 树与二叉树的运用 综合应用题 第10题 void Output(BSTANode *bt,keyType k) {if(bt==NULL)return;if(bt-> ...

  9. 《Go语言圣经》学习笔记 第四章 复合数据类型

    <Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...

最新文章

  1. JavaScript 工作原理之五-深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势(译)...
  2. 和我一起学VSTA(Visual Studio Tools for Applications )(一)
  3. TEASOFT教学软件
  4. iOS开发学习之MapKit - 获得在MapView(地图)中显示多个标记的区域(MKCoordinateRegion)...
  5. uva 1476 - Error Curves
  6. maven依赖,聚合和继承
  7. 潜安 | 分享最新最前沿的IT教程
  8. 【Python学习】Python的点滴积累
  9. MySQL 数据库崩溃(crash)的常见原因和解决办法
  10. python写的平行四边形_实现一个平行四边形
  11. 项目进度管理__计划评审技术之标准正态分布表
  12. c语言.jpg图片转成数组_Heic图片格式转换器
  13. 跨境电商支付方式之如何玩转跨境支付
  14. 多元函数概念和偏导数
  15. 计算机视觉编程 第六章 图像聚类
  16. tomcat设置默认页面及端口更改
  17. Markdown-img使用指南
  18. 忠告360安全卫士督导委员:小心沦为周鸿一的工具(zz)
  19. android 寺库trytry_寺库trytry联手人民日报 以体验感升级共享经济
  20. u盘linux和win7双系统安装教程,双系统安装Win7系统U盘安装linux centos7,详细步骤...

热门文章

  1. openstack网络服务neutron
  2. mongo实现消息队列
  3. ORA-32004: obsolete and/or deprecated parameter(s) specified
  4. bootstrap datepicker Uncaught TypeError: Cannot call method 'split' of undefined问题
  5. nginx telnet sshd
  6. 推荐65个以自然风光为背景的UI设计
  7. 88e1111光电选择配置说明
  8. qq音乐 android pad版,QQ音乐HD(com.tencent.qqmusicpad) - 4.12.1.4 - 应用 - 酷安
  9. alert 返回页面 刷新_详解 HTML 页面原生的生命周期事件
  10. feignclient多个配置_@FeignClient同一个name使用多个配置类的解决方案