原文链接:https://blog.csdn.net/wxbmelisky/article/details/47755753

面试被问到这个问题,记录一下。

1.概念

平衡二叉树建立在二叉排序树的基础上,目的是使二叉排序树的平均查找长度更小,即让各结点的深度尽可能小,因此,树中每个结点的两棵子树的深度不要偏差太大。

平衡二叉树的递归定义:平衡二叉树是一棵二叉树,其可以为空,或满足如下2个性质:①左右子树深度之差的绝对值不大于1。②左右子树都是平衡二叉树。

平衡因子的概念:结点的平衡因子 = 结点的左子树深度 — 结点的右子树深度。

最低不平衡结点的概念:用A表示最低不平衡结点,则A的祖先结点可能有不平衡的,但其所有后代结点都是平衡的。

2.平衡化的实现

整个实现过程是通过在一棵平衡二叉树中依次插入元素(按照二叉排序树的方式),若出现不平衡,则要根据新插入的结点与最低不平衡结点的位置关系进行相应的调整。分为LL型、RR型、LR型和RL型4种类型,各调整方法如下(下面用A表示最低不平衡结点):

(1)LL型调整:

由于在A的左孩子(L)的左子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1增至2。下面图1是LL型的最简单形式。显然,按照大小关系,结点B应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡,A结点就好像是绕结点B顺时针旋转一样。

图1  最简单的LL型调整

LL型调整的一般形式如下图2所示,表示在A的左孩子B的左子树BL(不一定为空)中插入结点(图中阴影部分所示)而导致不平衡( h 表示子树的深度)。这种情况调整如下:①将A的左孩子B提升为新的根结点;②将原来的根结点A降为B的右孩子;③各子树按大小关系连接(BL和AR不变,BR调整为A的左子树)。

图2  一般形式的LL型调整

(2)RR型调整:

由于在A的右孩子(R)的右子树(R)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由-1变为-2。图3是RR型的最简单形式。显然,按照大小关系,结点B应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡,A结点就好像是绕结点B逆时针旋转一样。

图3  最简单的RR型调整

RR型调整的一般形式如下图4所示,表示在A的右孩子B的右子树BR(不一定为空)中插入结点(图中阴影部分所示)而导致不平衡( h 表示子树的深度)。这种情况调整如下:①将A的右孩子B提升为新的根结点;②将原来的根结点A降为B的左孩子;③各子树按大小关系连接(AL和BR不变,BL调整为A的右子树)。

图4  一般形式的RR型调整

(3)LR型调整:

由于在A的左孩子(L)的右子树(R)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由1变为2。图5是LR型的最简单形式。显然,按照大小关系,结点C应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡。

图5  最简单的LR型调整

LR型调整的一般形式如下图6所示,表示在A的左孩子B的右子树(根结点为C,不一定为空)中插入结点(图中两个阴影部分之一)而导致不平衡( h 表示子树的深度)。这种情况调整如下:①将C的右孩子B提升为新的根结点;②将原来的根结点A降为C的右孩子;③各子树按大小关系连接(BL和AR不变,CL和CR分别调整为B的右子树和A的左子树)。

图6  一般形式的LR型调整

(4)RL型调整:

由于在A的右孩子(R)的左子树(L)上插入新结点,使原来平衡二叉树变得不平衡,此时A的平衡因子由-1变为-2。图7是RL型的最简单形式。显然,按照大小关系,结点C应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡。

图7  最简单的RL型调整

RL型调整的一般形式如下图8所示,表示在A的右孩子B的左子树(根结点为C,不一定为空)中插入结点(图中两个阴影部分之一)而导致不平衡( h 表示子树的深度)。这种情况调整如下:①将C的右孩子B提升为新的根结点;②将原来的根结点A降为C的左孩子;③各子树按大小关系连接(AL和BR不变,CL和CR分别调整为A的右子树和B的左子树)。

图8  一般形式的RL型调整

平衡二叉树的深度接近log2n的数量级,从而保证在二叉排序树上插入、删除和查找等操作的平均时间复杂度为O(log2n)。

面试被问到平衡二叉树如何平衡?相关推荐

  1. b+树时间复杂度_阿里面试,问了B+树,这个回答让我通过了

    前言 上周我通过阿里一面,岗位是客户端开发工程师(是的,还是java岗!).面试过程中面试官问了B+树,回答时面试官一直点头(应该回答得还不错所以过了),今天详细讲一讲B+树. 平衡二叉树 它是一棵空 ...

  2. 查找树的指定层级_阿里面试,问了B+树,这个回答让我通过了

    前言 上周我通过阿里一面,岗位是客户端开发工程师(是的,还是java岗!).面试过程中面试官问了B+树,回答时面试官一直点头(应该回答得还不错所以过了),今天详细讲一讲B+树. 平衡二叉树 它是一棵空 ...

  3. 【154期】面试官问:请你说说 B 树、B+ 树的原理及区别?

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方留言必回,有问必答! 每天 08:35 更新文章,每天进步一点点... 之前在 ...

  4. Java年薪30W+面试必问知识之《2020年面试宝典总纲》

    前言 一份月薪30K的java开发岗位工作要求是怎样的呢?面试都会问到哪些呢? 任职要求: 1.计算机或相关专业本科(或以上)学历,具备3年以上Java服务端开发经验,熟悉常用的Java开源框架,如熟 ...

  5. 面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型

    面试必问:一文弄懂MySQL数据库索引之底层数据结构和索引类型 前言 一.索引 1.1作用 1.2特点 1.3使用 1.3.1创建索引 1.3.2删除索引 1.3.3查看表中的索引 1.3.4查看SQ ...

  6. 最新,阿里腾讯后端社招面试21问梳理详解

    大家好,我是捡田螺的小男孩.有位朋友工作三年,去面试,给大家整理一下面试题,并附上答案. Mysql索引在什么情况下会失效 MySql的存储引擎InnoDB与MyISAM的区别 Mysql在项目中的优 ...

  7. 初创公司面试要问什么_聘请初创公司的产品设计师时要问的问题

    初创公司面试要问什么 by Bohdan Kit 通过Bohdan Kit 聘请初创公司的产品设计师时要问的问题 (Questions to ask when hiring a product des ...

  8. 面试被问到秒杀系统,这个点你一定得答到!

    本文来源:搜云库 概述 在面试被问到系统设计这块时候,秒杀系统经常是一个热门考点.今天我们就讨论一下其中的重要一点:如何进行秒杀系统的流量销锋? 如果你看过秒杀系统的流量监控图的话,你会发现它是一条直 ...

  9. 面试官问你B树和B 树,就把这篇文章丢给他

    原文链接:面试官问你B树和B 树,就把这篇文章丢给他 在看这篇文章之前,我们回顾一下前面的几篇关于MySQL的文章,应该对你读下面的文章有所帮助. InnoDB与MyISAM等存储引擎对比 面试官问你 ...

  10. 面试官问你的缺点是什么,该如何回答?

    作为一个资深HR,此题感触颇深. 当我微笑着问你,可以谈谈自己的缺点吗?如果应聘者低头莞尔一笑,或羞涩或含蓄地说: "我妈妈说,我最大的缺点,就是太执着,不撞南墙不回头--" &q ...

最新文章

  1. python linux arm_[Python]python for ARM/LINUX
  2. Linux 学习笔记_10_Shell编程_2_Shell编程语法(三)
  3. 《Advanced Data Structures》读书笔记
  4. 获取一段html的内容简介
  5. 【一步解决】eclipse jee左边的项目栏不见了
  6. c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序
  7. td外边加div为啥不隐藏_过年炸油饼注意了,秘制配方比例教给你,柔软不吸油,放凉了不硬...
  8. 门槛低的行业看天赋,门槛高的行业看毅力
  9. PDF如何编辑,怎么删除空白页面
  10. CentOS7通过定时脚本阻断异常IP连接SSH(实测)
  11. SQL注入如何进行攻击
  12. PHP获取真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR
  13. CPU压力测试工具cpuburn
  14. 经典案例悬臂梁受力有限元理论与程序设计_《数值计算与程序设计》系列课程之三
  15. 百度,360,搜狗,必应浏览器网站收录提交(SEO优化)
  16. matlab 祁彬彬,MATLAB 向量化编程基础精讲
  17. 招聘网探究分析报告(以描述性分析为主)
  18. docker load镜像报错:open /var/lib/docker/tmp/docker-import-525555606/repositories: no such file or direc
  19. 面试时,被问到职业规划如何作答?
  20. adb简介及常用命令

热门文章

  1. 程序员过了 35 岁还能干嘛?这是我听过最棒的建议!
  2. 一脸懵逼搭建Zookeeper分布式集群
  3. python爬虫入门教程——爬取360翻译
  4. 数据结构_C语言_实验三_图 ——六度空间
  5. win10 安装mysql 卡死_win10安装Mysql5.5卡住假死
  6. 关闭windows defender安全中心的方法
  7. python一次性导入依赖包_python如何导入依赖包
  8. php支付宝查询对账单下载地址,通过调用支付宝查询对账单接口返回bill_download_url下载zip,解压缩...
  9. rk3399 aarch64 arm64 使用英特尔神经计算棒openvino
  10. [转载] 使用Bugzilla,你肯定会遇到的坑。