平衡二叉树

​  平衡二叉搜索树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 —-来自百度百科

​  由于普通的二叉查找树会容易失去”平衡“,极端情况下,二叉查找树会退化成线性的链表,导致插入和查找的复杂度下降到 O(n) ,所以,这也是平衡二叉树设计的初衷。那么平衡二叉树如何保持”平衡“呢?根据定义,有两个重点,一是左右两子树的高度差的绝对值不能超过1,二是左右两子树也是一颗平衡二叉树。

  如下图所示,左图是一棵平衡二叉树,根节点10,左右两子树的高度差是1,而右图,虽然根节点左右两子树高度差是0,但是右子树15的左右子树高度差为2,不符合定义,所以右图不是一棵平衡二叉树。

​  由此可以看出平衡二叉树是一棵高度平衡的二叉查找树。所以,要构建跟维系一棵平衡二叉树就比普通的二叉树要复杂的多。在构建一棵平衡二叉树的过程中,当有新的节点要插入时,检查是否因插入后而破坏了树的平衡,如果是,则需要做旋转去改变树的结构。

  关于旋转,这东西不拿动态图将还真很难讲明白。所以我就借一下 最容易懂得红黑树 这篇文章中左旋右旋的图来讲。

​ 左旋

​ 右旋

  不同于顺时针跟逆时针变换这种方式去记忆,上面两个动态图特别方便记忆跟理解:

  左旋就是将节点的右支往左拉,右子节点变成父节点,并把晋升之后多余的左子节点出让给降级节点的右子节点;

  而右旋就是反过来,将节点的左支往右拉,左子节点变成了父节点,并把晋升之后多余的右子节点出让给降级节点的左子节点。

  即左旋就是往左变换,右旋就是往右变换。不管是左旋还是右旋,旋转的目的都是将节点多的一支出让节点给另一个节点少的一支

​  举个例子,像上图是否平衡二叉树的图里面,左图在没插入前”19“节点前,该树还是平衡二叉树,但是在插入”19“后,导致了”15“的左右子树失去了”平衡“,所以此时可以将”15“节点进行左旋,让”15“自身把节点出让给”17“作为”17“的左树,使得”17“节点左右子树平衡,而”15“节点没有子树,左右也平衡了。如下图,

  由于在构建平衡二叉树的时候,当有新节点插入时,都会判断插入后时候平衡,这说明了插入新节点前,都是平衡的,也即高度差绝对值不会超过1。当新节点插入后,有可能会有导致树不平衡,这时候就需要进行调整,而可能出现的情况就有4种,分别称作左左,左右,右左,右右

左左

  左左即为在原来平衡的二叉树上,在节点的左子树的左子树下,有新节点插入,导致节点的左右子树的高度差为2,如上即为”10“节点的左子树”7“,的左子树”4“,插入了节点”5“或”3“导致失衡。

​  左左调整其实比较简单,只需要对节点进行右旋即可,如下图,对节点”10“进行右旋,

  注意:如果对左右旋变换还不是很懂或不是很熟练的,可以对照着前面的那两个动图去想象,自己动手变换几次,就明白了。

左右

  左右即为在原来平衡的二叉树上,在节点的左子树的右子树下,有新节点插入,导致节点的左右子树的高度差为2,如上即为”11“节点的左子树”7“,的右子树”9“,插入了节点”10“或”8“导致失衡。

  左右的调整就不能像左左一样,进行一次旋转就完成调整。我们不妨先试着让左右像左左一样对”11“节点进行右旋,结果图如下,右图的二叉树依然不平衡,而右图就是接下来要讲的右左,即左右跟右左互为镜像,左左跟右右也互为镜像。

  右右跟左左一样,只需要旋转一次就能把树调整平衡,而左右跟右左也一样,都要进行旋转两次才能把树调整平衡,所以,首先上图的这种调整是错误的,正确的调整方式是,将左右进行第一次旋转,将左右先调整成左左,然后再对左左进行调整,从而使得二叉树平衡。

​  即先对上图的节点”7“进行左旋,使得二叉树变成了左左,之后再对”11“节点进行右旋,此时二叉树就调整完成,如下图,

右左

​  右左即为在原来平衡的二叉树上,在节点的右子树的左子树下,有新节点插入,导致节点的左右子树的高度差为2,如上即为”11“节点的右子树”15“,的左子树”13“,插入了节点”12“或”14“导致失衡。

​  前面也说了,右左跟左右其实互为镜像,所以调整过程就反过来,先对节点”15“进行右旋,使得二叉树变成右右,之后再对”11“节点进行左旋,此时二叉树就调整完成,如下图,

右右

  右右即为在原来平衡的二叉树上,在节点的右子树的右子树下,有新节点插入,导致节点的左右子树的高度差为2,如上即为”11“节点的右子树”13“,的左子树”15“,插入了节点”14“或”19“导致失衡。

  右右只需对节点进行一次左旋即可调整平衡,如下图,对”11“节点进行左旋。

数据结构:平衡二叉树概念、旋转相关推荐

  1. 数据结构——平衡二叉树的的旋转问题

    在学习有关数据结构平衡二叉树的时候,我就特别困惑在二叉查找树中是如何将树旋转和交换孩子的.这里,我将自己的总结写下来,喜欢大家一起交流进步!        这个需要旋转的情况大体可以·分为4种情况.分 ...

  2. 数据结构---平衡二叉树

    数据结构-平衡二叉树 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> typedef struct avlTree { ...

  3. 用c语言编译二叉树,C语言 数据结构平衡二叉树实例详解

    数据结构平衡二叉树 参考代码如下: /* 名称:平衡二叉树 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include #include #include ...

  4. 【向题看齐】408之数据结构DS概念记忆总结

    408之数据结构DS概念记忆总结 1.线性表 2.栈和队列 3.串 4.树 4.1.树的性质 4.2.二叉树的性质 4.3.满二叉树的性质 4.4.线索二叉树的性质 4.5.二叉排序树的性质 4.6. ...

  5. 考研数据结构の基础概念

    考研数据结构の基础概念 第一章 绪论 第二章 线性表 第三章 栈与队列 第四章 串 第五章 矩阵与广义表 第六章 树 第七章 图 第八章 排序 第九章 查找 第一章 绪论 1.数据:是对客观事物的符号 ...

  6. 【数据结构总结】第一章:数据结构基本概念

    [数据结构总结]第一章:数据结构基本概念 本文主要是以思维导图的形式概括数据结构第一章的精华内容,基本不会用到文字性的内容,目的是为了给大家梳理每个重要的知识点的相关概念,方便大家在复盘的时候快速阅读 ...

  7. Python数据结构与算法(三)--数据结构的概念

    上一章我们看Python内置的模块可以测试代码的时间,有的代码执行时间短有的执行时间长,就是说效率不一样. 如果上面不明显的话,大家看下面两个方法.append() 和 insert(0) impor ...

  8. 数据结构 (一) ----- 数据结构基本概念基于数组实现线性表

    相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> 文章目录 数据结构基本概念 一.逻辑结构 二.存储结构 三.数据结构定义 四.数据结构的通用的几 ...

  9. 数据结构 基本概念(数据项--数据元素--数据对象-数据类型-抽象数据类型)

    //数据结构基本概念 #include<iostream> using namespace std;/* 数据 – 程序的操作对象,用于描述客观事物 数据的特点: 可以输入到计算机 可以被 ...

  10. C语言数据结构-第一讲-数据结构基础概念-电大

    第一讲数据结构基础概念内容简介 数据是表征客观事物的可记录可识别的符号集合.数据是信息处理的核心基础. 本讲主要介绍了与数据结构有关的基本概念术语: l       数据 l       数据元素 l ...

最新文章

  1. C语言交换两个数字的三种做法
  2. 搜索引擎的选择—百度还是谷歌?
  3. SaS中ne在mysql语句对应_SAS学习经验总结分享:篇四—SQL过程
  4. 2.42死锁的处理策略一预防死锁
  5. HipHop PHP HHVM资料收集
  6. 状态规划P4270小奇挖矿2
  7. Mac卸载比较彻底的软件管理工具:App Cleaner Uninstaller
  8. com app.html,downloadApp.html
  9. cs6给画笔分组_画笔工具,PS cs6笔刷入门介绍
  10. 尚硅谷微服务分布式电商项目《谷粒商城》基础篇学习总结
  11. c语言简单教师管理系统,C语言教师管理系统代码
  12. torch.ones理解
  13. 搜索引擎点击日志聚类实现相关搜索
  14. Chrome 浏览器远程调试
  15. Python网站开发库大全(全面)
  16. 渐变折射率(GRIN)介质的构建与建模
  17. 转载李嘉诚先生曾经写的一首激励他的员工的诗,送给大家!
  18. 超 60 万人落户西安,程序员就业下一站?
  19. 使用Beaglebone Black的PRU(二)——Hello World!
  20. 手游《奔跑吧?骚年!》技术分享(四):矩形碰撞检测

热门文章

  1. 基于SmartQQ协议的QQ聊天机器人-4
  2. 深入浅出 kvm qemu libvirt
  3. React-Native 之 项目实战(五)
  4. Android Bitmap开发之旅--基本操作
  5. ECMAScript 6教程 (一)
  6. C# 控件缩写大全+命名规范+示例
  7. 高性能计算的线程模型:Pthreads 还是 OpenMP
  8. GPU(CUDA)学习日记(十三)------ CUDA内存简介
  9. 超详细的8psk调制解调通信系统讲解与仿真
  10. [云炬创业管理笔记]第九章为创业成败而准备测试4