平衡二叉树

平衡二叉树

匿名 (未验证) 提交于 2019-12-03 00:40:02
why? what? when? how? 最近几天看了某个大佬写的学习总结,觉得这个方式不错就引进了。 why 为什么要用平衡二叉树? 二叉搜索树 二叉搜索树的查找效率和 BST 建立的时候节点输入顺序相关。 1. 若输入节点顺序 1、2、3、4、5 树的深度为 5,查找效率 O(N),平均查找长度 ASL = ( 1+2+3+4+5 ) / 5 = 3 2. 若输入节点顺序 4、3、5、1、2 该树是完全二叉树,树的深度是 3,查找效率是 O(log2n), ASL = ( 1+2 2+3 2 ) / 5 = 2.1 因为 BST 的查询效率和节点输入的顺序有很大联系最坏情况是 O(N),为了提高查询效率所以平衡二叉树(查找的时间复杂度 O(log2N) ―― 证明见定义后面)出现了。 what 什么是平衡二叉树? 平衡因子( Balance Factor,简称 BF ):BF(T)=hL-hR,其中hL和hR分别为T的左、右子树的高度。 平衡二叉树 ( Balanced Binary Tree ) ( AVL树 ) 空树,或者任一结点左、右子树高度差的绝对值不超过1,即 |BF(T)| <= 1 . 平衡二叉树的高度能达到 log2N 吗? 如果能到达那么相比 BST 查询效率会高很多。 证明:设nh高度为h的平衡二叉树的最少结点数。结点数最少时: 若结点一个 1

平衡二叉树的旋转说明

匿名 (未验证) 提交于 2019-12-03 00:34:01
转载自: http ://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html 平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树。1962年,GM Adelson-Velsky和EM Landis发明了这棵树,所以它又叫AVL树。平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logn)时间时间。但是频繁旋转会使插入和删除牺牲掉O(logN)的的左右的时间,不过相对二叉查找树来说,时间上稳定了很多。 平衡二叉树实现的大部分过程和二叉查找树是一样的(学平衡二叉树之前一定要会二叉查找树),区别就在于插入和删除之后要写一个旋转算法去维持平衡,维持平衡需要借助一个节点高度的属性。我参考了机械工业出版社的“数据结构与算法分析-C语言描述”写了一个C ++版的代码。这本书的AVLTree讲的很好,不过没有很完整的去描述。我会一步一步的讲解如何写平衡二叉树,重点是平衡二叉树的核心部分,也就是旋转算法。 四种不平衡的情况: 左左 。   2,6

判断二叉树是不是平衡二叉树

匿名 (未验证) 提交于 2019-12-03 00:14:01
//判断一个树是不是平衡二叉树 //任何节点的左子树和右子树高度差不超过1 public class BalanceTree { public static void main ( String [] args ) { Node root = new Node ( 1 ); root . left = new Node ( 2 ); root . right = new Node ( 3 ); root . left . left = new Node ( 4 ); root . left . right = new Node ( 5 ); root . right . left = new Node ( 6 ); root . right . right = new Node ( 7 ); root . left . right . left = new Node ( 8 ); root . left . right . left . left = new Node ( 9 ); System . out . println ( isB ( root )); } public static boolean isB ( Node head ) { return process ( head ). isB ; } public static returnData process (

红黑树和AVL树(平衡二叉树)的定义、特点以及两者的区别

匿名 (未验证) 提交于 2019-12-03 00:05:01
红黑树和AVL树(平衡二叉树)的定义、特点以及两者的区别 定义 性质 区别 定义 AVL树:平衡二叉树又称AVL树,是一种特殊的二叉查找树,其左右子数都是平衡二叉树,且左右子树高度差的绝对值不超过1.一句话表述为:以树中所有结点为根的树的左右子树高度差的绝对值不超过1.将二叉树上结点的左子树深度减去右子树深度称为平衡因子BF,那么平衡二叉树上的所有结点的平衡因子只可能是-1、0和1.只要二叉树上有一个结点的平衡因子的绝对值大于1,该二叉树就是不平衡的。 红黑树:是一种二叉查找树,但在每个结点增加一个存储位表示结点的颜色,可以是红或者黑(非黑即红)。通过对任何一条从根到叶子的路径上各个结点着色的方式的限制,红黑树确保没有一条路径会比其他路径长出两倍,因此红黑树是一种弱平衡二叉树,相对于要求严格的AVL树来说,它的旋转次数少,所以对于搜索、插入、删除操作比较多的情况下,通常使用红黑树。 性质 红黑树的性质如下:1.每个结点非红即黑;2.根节点是黑的;3.每个叶节点(叶节点即树尾端NULL指针或NULL结点)都是黑的;4.如果一个结点是红色的,则它的子节点必须是黑色的;5.对于任何结点而言,其到叶子点树NULL指针的每条路径都包含相同数目的黑结点。 区别 区别:AVL树是高度平衡的,频繁的插入和删除,会引起频繁的rebalance,导致效率下降;红黑树不是高度平衡的,算是一种折中

二叉树基本原理

匿名 (未验证) 提交于 2019-12-02 23:56:01
二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,且两个子节点有序。 下面开始介绍几种常见的二叉树类型: 1. 完全二叉树 若设二叉树的深度为k,除第k层外,其他各层(1~(k-1)层)的节点数都达到最大值,且第k层所有的节点都连续集中在最左边,这样的树就是完全二叉树。如图: (图片仅参考网友,侵删) 完全二叉树是一种效率很高的数据结构,而堆是一种完全二叉树或者近似完全二叉树,因此堆的效率也很高;像十分常用的排序算法、Dijkstra算法、Prim算法等都要用堆才能优化,二叉排序树的效率也要借助平衡性来提高,而平衡性是基于完全二叉树的。 (以上摘自: https://www.jianshu.com/p/6a30657bf894 ) 2. 满二叉树 满二叉树的定义分两种:国内定义和国外(国际)定义。 国内定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。如图: 国外(国际)定义:如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。(一棵满二叉树的每一个结点要么是叶子结点,要么它有两个子结点,但是反过来不成立,因为完全二叉树也满足这个要求,但不是满二叉树),如图: 当然,不难看出,国外(国际)的定义已经包含了国内的定义了,也就是国内的定义是国外定义的子集。 (以上摘自: https://baike.baidu.com

平衡二叉树(二叉搜索树)

有些话、适合烂在心里 提交于 2019-12-02 23:32:49
    平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。   特殊的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树。    二叉查找树实际上是数据域有序的二叉树, 即对树上的每个结点,都满足其左子树上所有结点的数据域均小于或等于根结点的数据域, 右子树上所有结点的数据域均大于根结点的数据域。如下图所示: 其中左节点要比当前子树根节点小,右节点要比当前子树根节点大,如第一次进入二叉树, 根节点为temp为5,再进来3和根节点比较,发现根节点的左节点为空,所以3放在5的左节点,进来7,比5大,5的右节点为空,7到5的右节点,再进来2,找到5,比5小,进去继续找,发现5的左节点不为空,temp为3作当前小平衡树的根,发现3的左为空,此时将2放到3的左节点.... 代码实现: #include<stdio.h> #include<stdlib.h> typedef struct node{ int

mysql索引原理及优化(二)

匿名 (未验证) 提交于 2019-12-02 22:02:20
索引原理分析:数据结构 索引是最常见的慢查询优化方式 其是一种优化查询的数据结构,MySql中的索引是用B+树实现,而B+树就是一种数据结构,可以优化查询速度,可以利用索引快速查找数据,优化查询。 可以提高查询速度的数据结构: 哈希表、完全平衡二叉树、B树、B+树等等 哈希 不支持范围查询 。 完全平衡二叉树 :对于数据量大情况,它相比于哈希或者B树、B+树需要 查找次数更多 。 B树 :比完全平衡二叉树要矮,查询速度更快,所需索引空间更小。 B+树 :B+树比B树要胖,B+树的非叶子节点会冗余一份在叶子节点中,并且也在 叶子节点会用指针相连 。 B树相比完全平衡二叉树查询次数更少,即有更少的磁盘IO次数,性能更优; B+树是B树的升级版 ,其为了提高范围查找的效率。 总结:Mysql选用B+树这种数据结构作为索引, 可以提高查询索引时的磁盘IO效率,并且可以提高范围查询的效率,并且B+树里的元素也是有序的。 ac也走,但是只走a索引。 为什么哈希表、完全平衡二叉树、B树、B+树都可以优化查询,为何Mysql独独喜欢B+树? 哈希表有什么特点? 假如有这么一张表(表名: sanguo ): 现在对 name 字段建立哈希索引: select * from sanguo where name='周瑜' 可以直接对‘周瑜’按哈希算法算出来一个数组下标

平衡二叉树的java实现

匿名 (未验证) 提交于 2019-12-02 21:53:52
一、概念 二叉搜索树的java实现 ,那它有什么特别的地方呢,了解二叉搜索树的基本都清楚,在按顺序向插入二叉搜索树中插入值,最后会形成一个类似链表形式的树,而我们设计二叉搜索树的初衷,显然是看中了它的查找速度与它的高度成正比,如果每一颗二叉树都像链表一样,那就没什么意思了,所以就设计出来了平衡二叉树,相对于二叉搜索树,平衡二叉树的一个特点就是,在该树中,任意一个节点,它的左右子树的差的绝对值一定小于2。关于它的演变什么的,请自行网上搜索答案。在本文中,为了方便,也是采用了int型值插入。 二、平衡二叉树的构建 1 static class Node{ 2 Node parent; 3 Node leftChild; 4 Node rightChild; 5 int val; 6 public Node(Node parent, Node leftChild, Node rightChild,int val) { 7 super(); 8 this.parent = parent; 9 this.leftChild = leftChild; 10 this.rightChild = rightChild; 11 this.val = val; 12 } 13 14 public Node(int val){ 15 this(null,null,null,val); 16 } 17

数据结构与算法——平衡二叉树

旧城冷巷雨未停 提交于 2019-12-01 21:34:38
1 引言 2 二叉搜索树 2.1 定义 2.2 性质 2.3 节点结构 2.4 创建二叉搜索树 2.5 查找 2.6 插入 2.7 删除 3 平衡二叉树 3.1 定义 3.2 平衡因子 3.3 节点结构 3.4 左旋与右旋 3.5 插入 1 引言   二叉树是数据结构中的重点与难点,也是应用较为广泛的一类数据结构。二叉树的基础知识在之前的数据结构与算法——二叉树基础中已经详细介绍。本篇文章将着重介绍两类二叉树,二叉搜索树和平衡二叉树。 2 二叉搜索树 2.1 定义   二叉搜索树又称二叉查找树,亦称为二叉排序树。设x为二叉查找树中的一个节点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个节点,则key[y] <= key[x];如果y是x的右子树的一个节点,则key[y] >= key[x]。 2.2 性质   (1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;   (2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;   (3)左、右子树也分别为二叉搜索树;   例如:图2.2.1所示的二叉树为一棵二叉搜索树。 图2.2.1   例如:图2.2.2所示不是一棵二叉搜索树,因为节点40的左孩子节点值为44,不满足二叉搜索树的定义。 图2.2.2 2.3 节点结构   二叉树的节点结构通常包含三部分,其中有:左孩子的指针

平衡二叉树

寵の児 提交于 2019-12-01 16:57:42
平衡二叉树: 它或者是一颗空树,或者具有以下性质的二叉排序树: 它的左子树和右子树的深度(高度)之差(平衡因子)的绝对值不超过1 ,且它的左子树和右子树都是一颗平衡二叉树。 一棵AVL树有如下必要条件: 条件一:它必须是二叉查找树。有序 条件二:每个节点的左子树和右子树的 高度差 至多为1。 来源: https://www.cnblogs.com/fanBlog/p/11692439.html