平衡二叉树

平衡二叉树与AVL树

此生再无相见时 提交于 2019-12-19 02:30:24
平衡二叉树:对于任意一个节点左子树和右子树的高度差不能超过1 二分搜索树容易退化成链表 使用平衡因子转化为平衡二叉树 平衡二叉树的高度和节点数量之间的关系也是O(logn)的 标注节点的高度 平衡因子:左右子树的高度差的绝对值 维护平衡因子 右旋转过程LL //右旋转 private Node rightRotate ( Node y ) { Node x = y . left ; Node T3 = x . right ; x . right = y ; y . left = T3 ; y . height = Math . max ( getHeight ( y . left ) , getHeight ( y . right ) ) + 1 ; x . height = Math . max ( getHeight ( x . left ) , y . height ) + 1 ; return x ; } 左旋转过程RR //左旋转 private Node leftRotate ( Node y ) { Node x = y . right ; Node T2 = x . left ; x . left = y ; y . right = T2 ; y . height = Math . max ( getHeight ( y . left ) , getHeight (

平衡二叉树的旋转以及简便方法

我们两清 提交于 2019-12-18 23:00:05
刚开始听这个平衡二叉树的旋转,一听就蒙了,后来看了很多视频,有很多的说法。下面来介绍平衡二叉树 平衡二叉树:就是每个节点的平衡因子(Balance Factor)(以下简称BF)的绝对值小于等于1,即为0或1。 而BF就是每个节点左子树的高度减去右子树的高度。 平衡二叉树的旋转共有四种情况: 下面说一个定义,新插入的节点为破坏点,而由于破坏点的存在使二叉树失衡(|BF|>1)的节点为被破坏节点     1.LL型:即为被破坏节点的左子树的左子树插入破坏节点。如图: 数值为10的节点的左子树(数值为9的节点)的左子树(数值为8的节点),使其不平衡,而10为被破坏节点,8为破坏节点,那么LL即为10的L的9的L,后一个L为中心,顺时针旋转10节点(右旋),则得到:     RR型:即为被破坏节点的右子树的右子树插入破坏节点。如图 数值为10的节点的右子树(数值为11的节点)的右子树(数值为12的节点),使其不平衡,而10为被破坏节点,12为破坏节点,那么RR即为10的R的11的R,后一个R为中心,逆时针旋转10节点(左旋),则得到:     LR型:即为被破坏节点的左子树的右子树插入破坏节点。如图: 无论怎么旋转发现一次都不能完成,则需先将其转化为LL型(因为LR型第一个为L,所以转化为LL型,再按上面的步骤进行旋转),又因为LL为递减的顺序,所以6应该上去,5下来;   1

平衡二叉树

别说谁变了你拦得住时间么 提交于 2019-12-17 02:04:28
定义 平衡二叉树 :或者是一棵空的二叉排序树,或者是具有下列性质的二叉排序树: ⑴ 根结点的左子树和右子树的深度最多相差1; ⑵ 根结点的左子树和右子树也都是平衡二叉树。 平衡因子: 结点的平衡因子是该结点的左子树的深度与右子树的深度之差。 结点的平衡因子=HL-HR 在平衡树中,结点的平衡因子可以是1,0,-1。 最小不平衡子树: 在平衡二叉树的构造过程中,以距离插入结点最近的、且平衡因子的绝对值大于1的结点为根的子树。 构造平衡二叉树 基本思想 : 在构造二叉排序树的过程中,每插入一个结点时,首先检查是否因插入而破坏了树的平衡性, 若是, 则找出最小不平衡子树, 在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。 平衡调整 设结点A为最小不平衡子树的根结点,对该子树进行平衡调整归纳起来有以下四种情况: LL型 RR型 LR型 RL型 1.LL型&&RR型 单次旋转 2.LR型&RL型 两次旋转 来源: CSDN 作者: 2018417 链接: https://blog.csdn.net/qq_43628835/article/details/103568939

【剑指Offer】No.27 平衡二叉树

◇◆丶佛笑我妖孽 提交于 2019-12-10 14:14:31
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 平衡二叉树:平衡二叉树的左右子树也是平衡二叉树,那么所谓平衡就是左右子树的高度差不超过1. 解题思路 这道题从定义出发,检查每一个左子树与右子树的高度差。所以基于求二叉树的深度,想到每一次的左右子树高度进行检查,并且返回左右子树较大高度作为其根节点所在子树的高度。 public class Solution { boolean flag = true; public boolean IsBalanced_Solution(TreeNode root) { if (root == null) { return flag; } func(root); return flag; } private int func(TreeNode root) { if (root == null) { return 0; } int left = func(root.left) + 1; int right = func(root.right) + 1; if (left - right > 1 || right - left > 1) { flag = false; } return (left > right) ? left : right; } } 来源: CSDN 作者: 浅浅的成长 链接: https://blog.csdn.net

二叉查找树、平衡二叉树(AVLTree)、平衡多路查找树(B-Tree),B+树

一世执手 提交于 2019-12-10 12:15:30
B+树索引是B+树在 数据库 中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。 B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。 在讲B+树之前必须先了解 二叉查找树 、 平衡二叉树(AVLTree) 和 平衡多路查找树(B-Tree) ,B+树即由这些树逐步优化而来。 二叉查找树 二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于根的键值。 如下图所示就是一棵二叉查找树, 对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2, 深度为n的节点的查找次数为n, 因此其平均查找次数为 (1+2+2+3+3+3) / 6 = 2.3次 二叉查找树可以任意地构造,同样是2,3,5,6,7,8这六个数字,也可以按照下图的方式来构造: 但是这棵二叉树的查询效率就低了。因此 若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的,从而引出 新的定义——平衡二叉树,或称AVL树 。 平衡二叉树(AVL Tree)----(基于【二插树】改善,查询效率提高) 平衡二叉树(AVL树)在符合二叉查找树的条件下, 还满足任何节点的两个子树的高度最大差为1 。 下面的两张图片: 左边是AVL树,它的任何节点的两个子树的高度差<=1; 右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1;

平衡二叉树的基本操作

喜欢而已 提交于 2019-12-10 06:05:57
题目链接 平衡二叉树又称AVL树,它是一种具有平衡因子的特殊二叉排序树。平衡二叉树或者是一棵空树,或者是具有以下几条性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值; 它的左右子树也分别为平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。 若将二叉树上结点的平衡因子定义为该结点的左子树深度减去它的右子树的深度,则平衡二叉树上的所有结点的平衡因子只可能为-1、0和1。只要二叉树上有一个结点的平衡因子的绝对值大于1,则这棵二叉树就是不平衡的。 通过平衡二叉树的性质不难得知,其插入、删除、查询都操作的时间复杂度均为O(log2n)。 解释一下右转 代码如下: void lg_R ( lg * * root ) { lg * t = ( * root ) - > left ; ( * root ) - > left = t - > right ; t - > right = ( * root ) ; ( * root ) - > h = lg_geth ( ( * root ) ) ; t - > h = lg_geth ( t ) ; * root = t ; } 左转类似。 总代码如下: # include <stdio.h> # include <stdlib.h> typedef

数据结构与算法——常用数据结构及其Java实现

懵懂的女人 提交于 2019-12-09 18:27:30
本文采用Java语言来进行描述,帮大家好好梳理一下,在工作和面试中用的上数据结构与算法。亦即总结常见的的数据结构,以及在Java中相应的实现方法,务求理论与实践一步总结到位。 常用数据结构 数组 数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。数组的优点是:get和set操作时间上都是O(1)的;缺点是:add和remove操作时间上都是O(N)的。 Java中,Array就是数组,此外,ArrayList使用了数组Array作为其实现基础,它和一般的Array相比,最大的好处是,我们在添加元素时不必考虑越界,元素超出数组容量时,它会自动扩张保证容量。 Vector和ArrayList相比,主要差别就在于多了一个线程安全性,但是效率比较低下。如今java.util.concurrent包提供了许多线程安全的集合类(比如 LinkedBlockingQueue),所以不必再使用Vector了。 链表 链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。链表的优点是:add和remove操作时间上都是O(1)的;缺点是:get和set操作时间上都是O(N)的,而且需要额外的空间存储指向其他数据地址的项。 查找操作对于未排序的数组和链表时间上都是O(N)。 Java中,LinkedList 使用链表作为其基础实现。

平衡二叉树失去平衡调整的四种方法

蹲街弑〆低调 提交于 2019-12-09 15:51:35
分类: 1,RR(单向右旋) 2,LL(单向左旋) 3,LR(先左后右) 4,RL(先右后左) 1)RR 上图结点数据表示标号,另一种此类问题相似情况 2)LL 相似情况:结点6插入到结点4的右结点时 3)LR 相似情况:结点6插入到结点5的右结点,则翻转后结点6在结点1的左结点 4)RL 类比LR 构造平衡二叉树: 序列 {5,4,2,8,6,9} 参考: link 来源: https://www.cnblogs.com/guoyujiang/p/12011309.html

平衡二叉树的旋转以及简便方法

对着背影说爱祢 提交于 2019-12-06 21:19:28
刚开始听这个平衡二叉树的旋转,一听就蒙了,后来看了很多视频,有很多的说法。下面来介绍平衡二叉树 平衡二叉树:就是每个节点的平衡因子(Balance Factor)(以下简称BF)的绝对值小于等于1,即为0或1。 而BF就是每个节点左子树的高度减去右子树的高度。 平衡二叉树的旋转共有四种情况: 下面说一个定义,新插入的节点为破坏点,而由于破坏点的存在使二叉树失衡(|BF|>1)的节点为被破坏节点     1.LL型:即为被破坏节点的左子树的左子树插入破坏节点。如图: 数值为10的节点的左子树(数值为9的节点)的左子树(数值为8的节点),使其不平衡,而10为被破坏节点,8为破坏节点,那么LL即为10的L的9的L,后一个L为中心,顺时针旋转10节点(右旋),则得到:     RR型:即为被破坏节点的右子树的右子树插入破坏节点。如图 数值为10的节点的右子树(数值为11的节点)的右子树(数值为12的节点),使其不平衡,而10为被破坏节点,12为破坏节点,那么RR即为10的R的11的R,后一个R为中心,逆时针旋转10节点(左旋),则得到:     LR型:即为被破坏节点的左子树的右子树插入破坏节点。如图: 无论怎么旋转发现一次都不能完成,则需先将其转化为LL型(因为LR型第一个为L,所以转化为LL型,再按上面的步骤进行旋转),又因为LL为递减的顺序,所以6应该上去,5下来;   1

从2-3-4树模型到红黑树实现

只谈情不闲聊 提交于 2019-12-06 06:26:32
目录 从2-3-4树模型到红黑树实现 前言 2-3-4树 查找 插入 树的生长 删除 左倾红黑树 查找 插入 删除 总结 参考文献 从2-3-4树模型到红黑树实现 前言 红黑树,是一个高效的二叉查找树。其定义特性保证了树的路径长度在黑色节点上完美平衡,使得其查找效率接近于完美平衡的二叉树。 但是红黑树的实现逻辑很复杂,各种旋转,颜色变化,直接针对其分析,大多数都是死记硬背各种例子,不太容易有个直观的理解。实际上,红黑树是实现手段,是其他概念模型为了方便在二叉树上实现进而定义的节点颜色这个信息。如果从概念模型入手,再一一对应,就容易理解的多了。而红黑树能够对应的模型有2-3树,2-3-4树等,下面我们会以2-3-4树作为概念模型,对红黑树进行分析。 2-3-4树 2-3-4树是对完美平衡二叉树的扩展,其定义为: 在一个节点中,可以存在1-3个 key 。 2-节点,拥有1个 key 和2个子节点。 3-节点,拥有2个 key 和3个子节点。 4-节点,拥有3个 key 和4个子节点。 子节点为空的节点称为叶子节点。 任意从根节点到叶子节点的路径拥有相同的长度,即路径上的链接数相同。 下图就是一个2-3-4树: 查找 2-3-4树的查找很简单,类似于二叉树,步骤如下: 将查找 key 和节点内的 key 逐一对比。 如果命中,则返回节点内 key 的对应值。 如果节点内的 key