zoukankan      html  css  js  c++  java
  • 常用树结构简介

    简介

    树结构是一种非线性存储结构,存储的是具有“一对多”关系的数据元素的集合。

    1.二叉树

    定义

    1.本身是有序树;
    2.树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2;

    例如,图 1a) 就是一棵二叉树,而图 1b) 则不是。
    image

    特点

    经过前人的总结,二叉树具有以下几个性质:

    • 二叉树中,第 i 层最多有 2i-1 个结点。
    • 如果二叉树的深度为 K,那么此二叉树最多有 2K-1 个结点。
    • 二叉树中,终端结点数(叶子结点数)为 n0,度为 2 的结点数为 n2,则 n0=n2+1。

    性质 3 的计算方法为:对于一个二叉树来说,除了度为 0 的叶子结点和度为 2 的结点,剩下的就是度为 1 的结点(设为 n1),那么总结点 n=n0+n1+n2。
    同时,对于每一个结点来说都是由其父结点分支表示的,假设树中分枝数为 B,那么总结点数 n=B+1。而分枝数是可以通过 n1 和 n2 表示的,即 B=n1+2n2。所以,n 用另外一种方式表示为 n=n1+2n2+1。
    两种方式得到的 n 值组成一个方程组,就可以得出 n0=n2+1。

    2.AVL树

    定义

    1. 是一 棵空树或它的左右两个子树的高度差的绝对值不超过1;
    2. 并且左右两个子树都是一棵平衡二叉树。

    又被称为平衡二叉搜索树。
    image

    特点

    某结点的左子树与右子树的高度(深度)差即为该结点的平衡因子(BF,Balance Factor)。平衡二叉树上所有结点的平衡因子只可能是 -1,0 或 1。如果某一结点的平衡因子绝对值大于1则说明此树不是平衡二叉树。

    • AVL树参考

    http://c.biancheng.net/view/3384.html

    红黑树

    定义

    1. 每个节点要么是黑色,要么是红色;
    2. 根节点是黑色;
    3. 每个叶子节点(NIL)是黑色;
    4. 每个红色结点的两个子结点一定都是黑色;
    5. 任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
      image

    特点

    红黑树并不是一个完美平衡二叉查找树,从图1可以看到,根结点P的左子树显然比右子树高,但左子树和右子树的黑结点的层数是相等的,也即任意一个结点到到每个叶子结点的路径都包含数量相同的黑结点(性质5)。所以我们叫红黑树这种平衡为黑色完美平衡。

    • 红黑树参考

    https://www.jianshu.com/p/e136ec79235c

    B树和B+树

    定义

    是m叉的多路平衡查找树。

    • 从理论上讲,二叉树查找速度和比较次数都是最小的,为什么不用二叉树呢?

    因为我们要考虑磁盘IO的影响,它相对于内存来说是很慢的。数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘页(对应索引树的节点)。所以我们要减少IO次数,对于树来说,IO次数就是树的高度,而“矮胖”就是b树的特征之一,它的每个节点最多包含m个孩子,m称为b树的阶,m的大小取决于磁盘页的大小。

    B树(B-树)特点

    • 树中每个结点至多有m棵子树。(即至多含有m-1个关键字,两颗子树指针夹着一个关键字);
    • 若根结点不是终端结点,则至少有两颗子树。(至少一个关键字);
    • 除根结点外的所有非叶子结点至少有[m/2]棵子树。(即至少含有[m/2]-1个关键字);
    • 所有的叶子结点出现在同一个层次上,不带信息。(就像是折半查找判断树中查找失败的结点)。
    • 每一个结点中的关键字满足从左到右依次增大的规则。

    B+树

    ① 有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
    ②:所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
    ③: 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
    ④:通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
    ⑤:同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素。

    B+树和B树区别

    ①:在B+树中,具有n个关键字的结点只含有n棵子树,即每个关键字对应一颗子树;而在B树中,具有n个关键字的结点含有(n+1)棵子树。
    ②:在B+树中,每个结点(非根内部结点)关键字个数n的范围是[m/2]<=n<=m(根结点1<=n<=m),在B树中,每个结点(非根内部结点)关键字个数n的范围是[m/2]-1<=n<=m-1(根结点:1<=n<=m-1)。
    ③: 在B+树中,叶结点包含信息,所有非叶结点仅起到索引的作用,非叶结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应的存储地址。
    ④:在B+树中,叶结点包含了全部关键字,即在非叶结点中出现的关键字也会出现在叶结点中;而在B树中,叶结点包含的关键字和其他结点包含的关键字是不重复的。
    ⑤:在B+树中,有一个指针指向关键字最小的叶子结点,所有叶子结点连接成一个单链表。

    B+树和B树最大区别

    B树内节点存储data;B+树内节点不存储data,所有值都存储在叶子节点中,这样一个节点可以存储更多的key,故mysql的InnoDB引擎使用的是B+树。

    详细讲解(B树和B+树)

    https://www.cnblogs.com/xiaofengshan/p/15443140.html

    XFS
  • 相关阅读:
    websocket 工作原理
    Flask中的wtforms使用
    DBUtils
    Django模板语言与视图(view)
    Django之图书管理系统
    Django的安装创建与连接数据库
    pymyspl模块
    多表查询与索引
    表的关系与查询
    mysql的数据类型与表约束
  • 原文地址:https://www.cnblogs.com/xiaofengshan/p/15417384.html
Copyright © 2011-2022 走看看