概述

关于树的概念很多,B树,B+树,红黑树等等。

但是你去翻翻百度百科,或者用百度或者谷歌搜索一下中文的树结构的介绍,全都是狗屁。没有哪个中文网站是真正精确解释树的定义的,尤其是百度百科。

下面我要根据我自己的学习和理解。给出一些中文的定义。

什么是二叉树(Binary Tree)

二叉树是每个节点最多有两个子节点的树。

二叉树的叶子节点有0个字节点,二叉树的根节点或者内部节点有一个或者两个字节点。

什么是二叉搜索树(Binary Search Tree)

二叉查找树又叫二叉搜索树,

它或者是一棵空树,或者是具有下列性质的二叉树:

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉搜索树。

一个印象比较深的二叉搜索树就是问手机号。

假设你遇到一个美女想问他手机号,但是美女一般不告诉你数字。她只回答是否题。

那么你可以问她不超过14个问题就可以知道她手机号了。

假定手机号最大值是1000 0000 0000

是否大于500 0000 0000,开始分叉。

如果大于500 0000 0000,那么是否大于750 0000 0000。。。

如果小于500 0000 0000,那么是否大于250 0000 0000。。。

以此类推,这就是一个典型的二叉搜索树。看起来很神奇,其实源自于一种巧妙的数学。

什么是平衡二叉树(AVL Tree)

AVL树全称G.M. Adelson-Velsky和E.M. Landis,这是两个人的人名。

AVL树定义:

所有节点的左右子树的高度差小于1的二叉树。

如下图

根节点左边高度是3,因为左边最多有3条边;右边高度而2,相差1.

根节点左边的节点50的左边是1条边,高度为1,右边有两条边,高度为2,相差1。

什么是B树(B tree)

B树也叫或B-树、B_树。

B树英文官方定义:

1、Every node has at most m children.
2、Every non-leaf node (except root) has at least [m/2] child nodes.
3、The root has at least two children if it is not a leaf node.
4、A non-leaf node with k children contains k − 1 keys.
5、All leaves appear in the same level.

我理解的B树定义:

1、根结点至少有两个子节点;

2、每个非叶子节点并且非根节点最少有m/2个,即内部节点的字节点个数最少也有m/2个。

3、根节点最少有两个字节点。

4、有k个关键字(关键字按递增次序排列)的非叶结点恰好有k+1个孩子。

5、所有叶子节点在同一层,即所有叶子几点高度一致。

如下图(B树的内部节点可以存放数据,类似ZK的中间节点一样。B树不是每个节点都有足够多的子节点)

什么是B+树(B+ tree)

B+树是从B树衍生而来。

跟B的不同:

1、B+树非叶子节点不存放数据,只存放keys。

2、B+树的叶子节点之间存在指针相连,而且是单链表

如下图(其实B+树上二叉搜索树的扩展,二叉搜索树是每次一分为二,B树是每次一分为多)

现代操作系统中,磁盘的存储结构使用的是B+树机制,mysql的innodb引擎的存储方式也是B+树机制

数据结构参考资料

下面这个网站是一个介绍了很多数据结构的英文网站,可以参考下:

https://www.javatpoint.com/b-plus-tree

https://www.cnblogs.com/geektcp/p/9992213.html

二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究的更多相关文章

  1. 树&二叉树&二叉搜索树

    树&二叉树 树是由节点和边构成,储存元素的集合.节点分根节点.父节点和子节点的概念. 二叉树binary tree,则加了"二叉"(binary),意思是在树中作区分.每个 ...

  2. 树(二叉树 & 二叉搜索树 & 哈夫曼树 & 字典树)

    树:n(n>=0)个节点的有限集.有且只有一个root,子树的个数没有限制但互不相交.结点拥有的子树个数就是该结点的度(Degree).度为0的是叶结点,除根结点和叶结点,其他的是内部结点.结点 ...

  3. 第七章 二叉搜索树(d4)AVL树:(3+4)-重构

  4. 第七章 二叉搜索树 (d3)AVL树:删除

  5. 第七章 二叉搜索树 (d2)AVL树:插入

  6. 第七章 二叉搜索树 (d1)AVL树:重平衡

  7. 数据结构学习笔记_树(二叉搜索树,B-树,B+树,B*树)

    一.查找二叉树(二叉搜索树BST) 1.查找二叉树的性质 1).所有非叶子结点至多拥有两个儿子(Left和Right): 2).所有结点存储一个关键字: 3).非叶子结点的左指针指向小于其关键字的子树 ...

  8. 高度平衡的二叉搜索树(AVL树)

    AVL树的基本概念 AVL树是一种高度平衡的(height balanced)二叉搜索树:对每一个结点x,x的左子树与右子树的高度差(平衡因子)至多为1. 有人也许要问:为什么要有AVL树呢?它有什么 ...

  9. L3-016 二叉搜索树的结构 (30 分) 二叉树

    二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值:若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值:它的左.右子树也分别 ...

随机推荐

  1. Codeforces Round #459 (Div. 2)The Monster[匹配问题]

    题意 给一个序列,包含(,),?,?可以被当做(或者),问你这个序列有多少合法的子序列. 分析 n^2枚举每一个子序列,暂时将每个?都当做右括号,在枚举右端点的时候同时记录两个信息:当前左括号多余多少 ...

  2. ue4 创建简易动画

    这个功能本来是在原动画基础上做调整用的,所以直接用来做动画并不是很合适,如果要做复杂动画,叠加的轨迹会非常多,不好用 (蒙皮好的)模型右键,创建一个动画合成 点开这个动画合成,创建动画序列(就是普通动 ...

  3. 洛谷P2868 [USACO07DEC]观光奶牛Sightseeing Cows

    P2868 [USACO07DEC]观光奶牛Sightseeing Cows 题目描述 Farmer John has decided to reward his cows for their har ...

  4. 17.视图--SQL

    一.什么是视图 视图是虚拟的表 为什么使用视图 重用SQL语句. 简化复杂的SQL操作.在编写查询后,可以方便地重用它而不必知道其基本查询细节. 使用表的一部分而不是整个表. 保护数据.可以授予用户访 ...

  5. 15.更新和删除数据--SQL

    一.更新数据 更新(修改)表中的数据,可以使用UPDA TE语句.有两种使用UPDA TE的方式: 更新表中的特定行: 更新表中的所有行. 警告:不要省略WHERE子句 在使用UPDA TE时一定要细 ...

  6. Python内建函数二

    内置函数二: 1.lambda (匿名函数) 为了解决一些简答的需求而设计的一句话函数.不需要def来声明. def func(n): return n*n f = lambda n: n*n 注意: ...

  7. Luogu P1155 双栈排序 图论?模拟吧。。

    今天想做做图论,于是点开了这道题....(是二分图染色然而我没看出来) 四种操作及条件: 1. s1.push() 需满足 待push的元素小于栈顶 && { 若在原序列中,待push ...

  8. SQL生成日期维度(到小时)

    #建表语句: CREATE TABLE [dbo].[Dim_日期3]( ) NOT NULL, [年] [int] NULL, ) NULL, ) NULL, ) NULL, ) NULL, ) N ...

  9. spring assert 用法

    spring在提供一个强大的应用开发框架的同时也提供了很多优秀的开发工具类,合理的运用这些工具,将有助于提高开发效率.增强代码质量.下面就最常用的Assert工具类,简要介绍一下它的用法.Assert ...

  10. springMVC框架的理解加深,个人的一些想法

    一 写spring-boot整合的时候,有种想看源码的冲动!呸,是钻牛角尖的毛病犯了... @RequestMapping("/index") public String inde ...