转载:http://blog.csdn.net/zhuyingqingfen/article/details/6530434

平衡二叉树

对于二叉查找树,尽管查找、插入及删除操作的平均运行时间为O(logn),但是它们的最差运行时间都是O(n),原因在于对树的形状没有限制。

平衡二叉树又称为AVL树,它或者是一棵空树,或者是有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左右子树的深度之差的绝对值不超过1。二叉树的的平衡因子BF为:该结点的左子树的深度减去它的右子树的深度,则平衡二叉树的所有结点的平衡因子为只可能是:-1、0和1

一棵好的平衡二叉树的特征:

(1)保证有n个结点的树的高度为O(logn)

(2)容易维护,也就是说,在做数据项的插入或删除操作时,为平衡树所做的一些辅助操作时间开销为O(1)

一、平衡二叉树的构造

在一棵二叉查找树中插入结点后,调整其为平衡二叉树。若向平衡二叉树中插入一个新结点后破坏了平衡二叉树的平衡性。首先要找出插入新结点后失去平衡的最小子树根结点的指针。然后再调整这个子树中有关结点之间的链接关系,使之成为新的平衡子树。当失去平衡的最小子树被调整为平衡子树后,原有其他所有不平衡子树无需调整,整个二叉排序树就又成为一棵平衡二叉树

1.调整方法

(1)插入点位置必须满足二叉查找树的性质,即任意一棵子树的左结点都小于根结点,右结点大于根结点

(2)找出插入结点后不平衡的最小二叉树进行调整,如果是整个树不平衡,才进行整个树的调整。

2.调整方式

(1)LL型

LL型:插入位置为左子树的左结点,进行向右旋转

由于在A的左孩子B的左子树上插入结点F,使A的平衡因子由1变为2,成为不平衡的最小二叉树根结点。此时A结点顺时针右旋转,旋转过程中遵循“旋转优先”的规则,A结点替换D结点成为B结点的右子树,D结点成为A结点的左孩子。
(2)RR型
RR型:插入位置为右子树的右孩子,进行向左旋转
由于在A的右子树C的右子树插入了结点F,A的平衡因子由-1变为-2,成为不平衡的最小二叉树根结点。此时,A结点逆时针左旋转,遵循“旋转优先”的规则,A结点替换D结点成为C的左子树,D结点成为A的右子树。
(3)LR型
LR型:插入位置为左子树的右孩子,要进行两次旋转,先左旋转,再右旋转;第一次最小不平衡子树的根结点先不动,调整插入结点所在的子树,第二次再调整最小不平衡子树。

由于在A的左子树B的右子树上插入了结点F,A的平衡因子由1变为了2,成为不平衡的最小二叉树根结点。第一次旋转A结点不动,先将B的右子树的根结点D向左上旋转提升到B结点的位置,然后再把该D结点向右上旋转提升到A结点的位置。

(4)RL型
RL型:插入位置为右子树的左孩子,进行两次调整,先右旋转再左旋转;处理情况与LR类似。

平衡二叉树 构造方法相关推荐

  1. 高度平衡二叉树的构建_平衡二叉树 构造方法(绝妙)

    构造方法 平衡二叉树 对于二叉查找树,尽管查找.插入及删除操作的平均运行时间为 O(logn) ,但是它们的最差 运行时间都是 O(n), 原因在于对树的形状没有限制. 平衡二叉树又称为 AVL 树, ...

  2. 平衡二叉树 构造方法RR RL LL LR

    对于二叉查找树,尽管查找.插入及删除操作的平均运行时间为O(logn),但是它们的最差运行时间都是O(n),原因在于对树的形状没有限制. 平衡二叉树又称为AVL树,它或者是一棵空树,或者是有下列性质的 ...

  3. 平衡二叉树平衡因子怎么计算_平衡二叉树(AVL Tree)旋转机制分析

    平衡二叉树(AVL Tree) 概述 AVL树是以二分搜索树(BST)为底层数据结构而实现的,其特性是需要维护AVL的|平衡因子| <= 1 平衡因子 对于一个父节点的左右子树高度差的绝对值需要 ...

  4. MFC二叉树可视化绘制 (C++)—— 插入、删除、先序遍历、中序遍历、后序遍历、层序遍历(基于平衡二叉树实现)

    界面展示: 相关文章目录 平衡二叉树的构造过程图解 C/C++平衡二叉树实现 -- 插入.删除.先序遍历.中序遍历.后序遍历.层序遍历(设计详解) MFC 在对话框中绘制图形的方法 -- 及二叉树绘制 ...

  5. kotlin中继承父属性使用构造方法

    kotlin中继承父属性使用构造方法 1. 定义父类,给它两个属性: abstract class AbstractResponseMessage {private var success = tru ...

  6. kotlin重写构造方法编译报错:Primary constructor call expected

    在kotlin中使用construct关键字定义构造方法,如果类定义时已经有构造方法(类名后带括号),需要添加构造方法时,需要使用以下写法: class User(var name,var age){ ...

  7. Java 构造方法与成员方法的区别

    学而时习之,温故而知新. 先说下自己怎样区分它们 认定构造方法是:类名与构造方法相同,这个方法就是构造方法, 这个类中除了构造方法以外的方法都是成员方法,原因是在类中除了变量外的基本都是成员方法. 看 ...

  8. private关键字和构造方法

    1.private: A: 是一个修饰符 B:可以 修饰成员变量,也可以修饰成员方法 C:被private修饰的成员只能在本类中访问 D:针对private修饰的成员变量,可以用getXxx()和se ...

  9. 构造方法与setXxx方法

    构造方法:给属性进行初始化 Person p=new Person("kobe",23); p=new Person("KG",24);这种方式貌似看起来是改名 ...

最新文章

  1. iOS端VR视频播放
  2. python绘制派大星_彩色派大星简笔画步骤
  3. 百度前端技术学院2017学习总结
  4. php复合索引,关于复合索引和单独索引的一个问题
  5. 机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法
  6. 面试前必须要知道的Redis面试题
  7. php redbean update,redbeanphp和表前缀
  8. python代码物理_利用python求解物理学中的双弹簧质能系统详解
  9. uni微信小程序 下载图片跟文字_微信小程序:图片与文字无法居中 最后解决的方法是——...
  10. ARCHLinux SETUP WITH FDISK
  11. spark 1.6.0 简单使用
  12. 用什么技术实现前台页面设计_装饰+装配式,用什么样的方式去实现室内的装配工程施工技术?...
  13. oschina mysql limit_Mysql中limit的用法
  14. 架构师必备之最全最系统的 Android 界面性能调优资料
  15. pycharm 无法安装模块 nothing to show
  16. 计算机网络:王道考研
  17. 如何入门单片机C语言
  18. 基于51单片机的电子称称重压力检测阈值报警系统方案原理图设计
  19. 接口收到CRC错包怎么处理
  20. Wiki引擎mediawiki

热门文章

  1. JAXB 有两个名为 ** 的属性,类的两个属性具有相同名称 **解决方案
  2. 0-1 背包问题的 4 种解决方法算法策略
  3. 01.search_api_综述
  4. @CachePut(与@Cacheable的差异)@CacheEvict
  5. mysql 记录所有操作_mysql 的一些记录的操作
  6. myisam怎么读_耗时半年,我成功“逆袭”,拿下美团offer(刷面试题+读源码+项目准备)...
  7. mysql 云主机名_mysql部署到云主机的笔记
  8. print在python2和python3的区别_Python2和Python3中print的不同点
  9. python网络编程能做什么_python网络编程——什么是socket?
  10. 蓝牙小电池图标_方寸间、掌握中,omthing小方盒开箱测评