• 二叉树、二叉搜索树、平衡二叉树、B树、B+树的精确定义和区别探究


     

    概述

    关于树的概念很多,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

  • 相关阅读:
    Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
    Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
    Pythonlog() 函数
    Rabbitmq+sockjs+stomp.js前端的使用
    alter table t_user alter column create_date set default CURRENT_TIMESTAMP; 报错(idea生成的sql)
    eldatepicker日期控件日期少一天
    实际开发中String转换为json串作为入参发生"JSON parse error:Cannot deserialize value of type Date......not a valid解决
    Cannot deserialize value of type `java.util.Date` from String
    ProtoBuf试用与JSON的比较
    TCP粘包/拆包问题
  • 原文地址:https://www.cnblogs.com/williamjie/p/11081096.html
Copyright © 2020-2023  润新知