转载: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. XP硬盘安装Ubuntu 10.10双系统图解(转)
  2. 51nod 1256 乘法逆元(扩展欧几里得)
  3. ELK错误1_Kafka-Logstash-Elasticsearch过程,Elasticsearch报grokparsefailure错误
  4. Linux 主要的发行系统版本介绍
  5. HTML中直接写js 函数
  6. Redis运维和开发学习笔记(3)redis搭建集群
  7. 命令关闭手机蓝牙_iPhone手机这些实用的便捷功能,你知道多少?
  8. 用友未获得服务器信息,客户端查询银行日记账没有数据出现,其他客户端和服务器正常...
  9. java源码编译_java 源码编译
  10. python不可以安装的软件包_安装好的python包竟然无法import
  11. 傲腾机器Linux,【收藏】傲腾装机必看!
  12. beanshell断言_Jmeter之BeanShell断言使用(示例代码)
  13. PHP利用SMTP发送邮件,测试ok
  14. 利用 Python 特性在 Jinja2 模板中执行任意代码
  15. 服务器网口灯亮但显示未插网线,网线插路由器WAN口,但WAN口灯不亮怎么办?
  16. 计算机二级选择题瞎蒙,一级消防员考试,一级消防员考试题大全
  17. 想健身该怎么做?要练出肌肉需要多久?
  18. TortoiseGit commands(命令)(完整中文翻译)
  19. kafka监控api,手撕面试官
  20. R语言导入xlsx包错误: JAVA_HOME cannot be determined from the Registry

热门文章

  1. Java的io类的使用场景
  2. 【最简便解法】1069 微博转发抽奖 (20分)
  3. Mysql主备延迟的原因
  4. linux(ubuntu)新建用户只有一个$问题,Ubuntu新建用户并指定目录
  5. 理解OSI七层模型(了解OSI七层模型,数据如何传输,封装,解封装)
  6. 使用selenium爬取某东的手机商品信息
  7. 好用的Markdown编辑器推荐
  8. 集群(一)——LVS负载均衡集群
  9. Linux网络模式及远程连接出错排障
  10. OSPF简单多区域及末梢区域配置