平衡二叉树

数据结构

廉价感情. 提交于 2019-12-06 01:52:08
什么是B+树? 历史: 1:全部遍历 2:hash 3 :二叉树 4 :平衡二叉树(avl) 5 :B树 6:b+树 加速查找速度的数据结构: (1)哈希:例如hashMap,查询/修改/插入/删除的平均时间复杂度是O(1); (2)树:例如平衡二叉树,查询/修改/插入/删除的平均时间复杂度是O(log2(n)); 来源: https://www.cnblogs.com/leeego-123/p/11955662.html

剑指offer-平衡二叉树-python

走远了吗. 提交于 2019-12-05 22:31:08
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 思路: 平衡二叉树 (AVL)平衡二叉树是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。它是一种高度平衡的二叉排序树。意思是说,要么它是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。 平衡二叉树是一种二叉排序树。也就是二叉排序树包含了平衡二叉排序树,其次它要满足后面的约束条件,就是每个结点的左子树和右子树的高度差不超过1 所以递归遍历左右子树,比较左右子树的深度 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def IsBalanced_Solution(self, pRoot): # write code here if not pRoot: return 1 left = self.IsBalanced_Solution(pRoot.left) right = self.IsBalanced_Solution(pRoot.right) if not left:return False if not right:return False

DS AVL树详解

浪子不回头ぞ 提交于 2019-12-05 19:29:12
    先说说二叉搜索树: 是有序的二叉树,根值>左节点值,右节点值>根值。     如果要查找某个值,二叉搜索树和二分查找一样,每进行一次值比较,就会减少一半的遍历区间。     但是,如果树插入的值一直递增/递减,就会出现这种情况:     这样,二叉树性能就完全失去了,直接退化成了顺序表,查找效率低下。     由此,引入了能保持性能最佳的二叉搜索树。      AVL树: 具有 高度平衡 的二叉搜索树 。     性质: 1.它的左右子树都是AVL树        2. 左右子树高度差(简称平衡因子)的绝对值不超过1       搜索的时间复杂度: O(log2(n))        AVL树节点      struct AVLTree{ pair<K,V> kv; AVLTreeNode* left; AVLTreeNode* right; AVLTreeNode* parent; int bf; //balance factor };    与二叉搜索树不同的是引入了父节点(方便后面讲的旋转)和平衡因子(保持高度平衡的核心)。        AVL树的插入:       在插入节点后,需要调整平衡:       1.bf更新规则:新增在左 父亲bf-1 ; 新增在右 父亲bf+1        2.持续往祖先更新 如果 祖先bf==0,祖先肯定是从1或者-1变来的

MySQL用B+树做索引

非 Y 不嫁゛ 提交于 2019-12-05 03:15:26
索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL的索引主要以B+树为主,但是要问到为什么用B+树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。 索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。 索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对全数据检索也很快,没有必要费力气建索引再去查找。索引在mysql数据库中分三类: B+树索引、Hash索引、全文索引 我们今天要介绍的是工作开发中最常接触到innodb存储引擎中的的B+树索引。 要介绍B+树索引,就不得不提二叉查找树,平衡二叉树和B树这三种数据结构。B+树就是从他们仨演化来的。 二叉查找树 首先,让我们先看一张图  从图中可以看到,我们为user表(用户信息表)建立了一个二叉查找树的索引。图中的圆为二叉查找树的节点,节点中存储了键(key)和数据(data)。 键对应user表中的id,数据对应user表中的行数据。二叉查找树的特点就是 任何节点的左子节点的键值都小于当前节点的键值,右子节点的键值都大于当前节点的键值。 顶端的节点我们称为根节点,没有子节点的节点我们称之为叶节点。 如果我们需要查找id=12的用户信息,利用我们创建的二叉查找树索引,查找流程如下: 1.

20182333 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结

大城市里の小女人 提交于 2019-12-05 00:31:50
20182333 2019-2020-1 《数据结构与面向对象程序设计》第九周学习总结 教材学习内容总结 第十六章 树 树 1.树是非线性结构,其元素组织为一个层次结构 2.树的度表示树中的任意结点的最大子结点数 3.有m个元素的平衡n叉树的高度是lognm 4.树的遍历有4种方法 5.进行层序遍历时可采用队列来储存树中的元素 6.使用数组实现二叉树时,位于位置n的元素的左孩子在(2n+1)的位置,其右孩子在(2*(n+1))的位置 7.树的基于数组的存储链实现方式可以占数组中的连续位置,不管树是不是完全树 8.如何在一般二叉树中添加及删除元素,要取决于树的用途 9.使用决策树可以设计专家系统 二叉树 1.二叉查找树时一颗二叉树,对于其中的每个结点,左子树上的元素小于父结点的值,二右子树上的元素大于等于父结点的值 2.如果没有其他的操作,二叉查找树的树形由元素的添加次序来决定 3.最有效地二叉查找树时平衡的,所以每次比较时可以排除一半的元素 4.当从二叉查找树中删除元素时要考虑三种情形,其中的两种比较简单 5.当从二叉查找树中删除有两个子结点的结点时,比较好的办法是用它的中序后继来取代它 6.可以对二叉查找树进行旋转以恢复平衡 部分计算公式 1.二叉树上第i层上的结点数目最多为2^(i-1)(i>=1) 2.深度为k的二叉树至多有2^k-1个结点(i>=1) 3

20182301 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结

Deadly 提交于 2019-12-05 00:26:35
20182301 2019-2020-1 《数据结构与面向对象程序设计》第9周学习总结 教材学习内容总结 第十六章 树的定义 根节点:唯一 节点的度:节点拥有的子树数。度为0:称为终端节点或叶节点 树的度:树内各节点的度的最大值 内部节点:除根节点外的节点 孩子(child):节点的子树的根 称为该节点的孩子,反过来,称为双亲(parent) 兄弟(sibling):同一双亲的孩子之间的关系 节点的祖先:从根到该节点所经分支上的全部节点 节点层次:根为第一层,根的孩子为第二层 树的深度(Depth):树中节点的最大层次 森林(Forest):是m(m>0)棵互不相交的树的集合 树的分类 满二叉树 如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。 如果一个二叉树的层数为K,且结点总数是(2^k) -1,则它就是满二叉树。 完全二叉树 它是由满二叉树而引出来的。 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边, 线索二叉树 n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域(就是用于指向左右孩子的域)。 利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。 加上线索的二叉树称为线索二叉树。 哈夫曼树(霍夫曼树)又称为最优树

练习4.2 平衡二叉树的根 (25 分) 浙大版《数据结构(第2版)》题目集

偶尔善良 提交于 2019-12-04 17:47:23
将给定的一系列数字插入初始为空的AVL树,请你输出最后生成的AVL树的根结点的值。 输入格式: 输入的第一行给出一个正整数 N( ≤),随后一行给出 N个不同的整数,其间以空格分隔。 输出格式: 在一行中输出顺序插入上述整数到一棵初始为空的AVL树后,该树的根结点的值。 输入样例1: 5 88 70 61 96 120 输出样例1: 70 输入样例2: 7 88 70 61 96 120 90 65 输出样例2: 88主要考查avl树的调整过程。代码: #include <stdio.h> #include <stdlib.h> typedef struct Node Node; struct Node { int Data; struct Node *Left,*Right; }*head = NULL; Node *New(int d) { Node *node = (Node *)malloc(sizeof(Node)); node -> Data = d; node -> Left = node -> Right = NULL; return node; } Node *ll(Node *node) { Node *l = node -> Left; node -> Left = l -> Right; l -> Right = node; return l; } Node

数据结构中各种树

a 夏天 提交于 2019-12-03 23:09:33
阅读目录 1. 二叉树 2. 二叉查找树 3. 平衡二叉树 3.1 平衡查找树之AVL树 3.2 平衡二叉树之红黑树 4. B树 5. B+树 6. B*树 7. Trie树   数据结构中有很多树的结构,其中包括二叉树、二叉搜索树、2-3树、红黑树等等。本文中对数据结构中常见的几种树的概念和用途进行了汇总,不求严格精准,但求简单易懂。 回到顶部 1. 二叉树   二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。 二叉树的定义: 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2 i-1 个结点;深度为k的二叉树至多有2 k-1 个结点;对任何一棵二叉树T,如果其终端结点数为n 0 ,度为2的结点数为n 2 ,则n 0 =n 2 +1。 二叉树的示例 : 满二叉树和完全二叉树:   满二叉树:除最后一层无任何子节点外,每一层上的所有结点都有两个子结点。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值,所有叶子结点必须在同一层上。   满二叉树的性质:   1) 一颗树深度为h,最大层数为k,深度与最大层数相同,k=h;   2) 叶子数为2 h ;   3) 第k层的结点数是:2 k-1 ;   4) 总结点数是:2 k-1 ,且总节点数一定是奇数。   完全二叉树

探寻数据库索引的底层原理

穿精又带淫゛_ 提交于 2019-12-03 20:16:26
我们都有到图书馆借书的经历,偌大的图书馆,为什么能在短的时间内找到想要找的书?如果这些书是杂乱无章的堆放,或者没有任何标识的放在书架,那么还能这么快的找到吗?这个场景就很接近我们软件开发中使用数据库的场景,图书馆的书就类似我们数据表中的数据,楼层索引牌、书架分类标识、索书号就类似我们查找数据的索引。那我们常用的数据库的索引底层的一个数据结构是什么样的呢?要了解数据库索引的底层原理,我们就得先了解一种叫树的数据结构,而树中很经典的一种数据结构就是二叉树!所以下面我们就从二叉树到平衡二叉树,再到B-树,最后到B+树来一步一步了解数据库索引底层的原理! 一.二叉树(Binary Search Trees) 二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树有如下特性: 1、每个结点都包含一个元素以及n个子树,这里0≤n≤2。 2、左子树和右子树是有顺序的,次序不能任意颠倒。左子树的值要小于父结点,右子树的值要大于父结点。   光看概念有点枯燥,假设我们现在有这样一组数[35 27 48 12 29 38 55],顺序的插入到一个数的结构中,步骤如下 好了,这就是一棵二叉树啦!我们能看到,经通过一系列的插入操作之后,原本无序的一组数已经变成一个有序的结构了

数据结构(三十八)平衡二叉树(AVL树)

匿名 (未验证) 提交于 2019-12-03 00:40:02
  一、平衡二叉树的定义   平衡二叉树(Self-Balancing Binary Search Tree或Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1。平衡二叉树是一种高度平衡的二叉排序树,即要么是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。   将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor),那么平衡二叉树上所有结点的平衡因子只可能是-1、0和1。   距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,称为最小不平衡树。      二、平衡二叉树的实现原理   平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入破坏了树的平衡性,若是,则找出最小不平衡树。在保持二叉排序树特性的前提下,调整最小不平衡树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。   以数组{3,2,1,4,5,6,7,10,9,8}为例:            注意的是: 图6到图7,对结点2进行左旋,本来结点3是结点4的左孩子,由于旋转后需要满足二叉排序树的特定,因此结点3最后成了结点2的右孩子。 另外,图11中, 如果对结点7进行左旋的话