概念 | 描述 |
---|---|
父子关系 | 结点之间相连的边 |
子树 | 当结点大于1时,其余的结点分为的互不相交的集合称为子树 |
度 | 一个结点拥有的子树数量称为结点的度 |
叶子 | 度为0的结点 |
孩子 | 结点的子树的根称为孩子结点 |
双亲 | 和孩子结点对应 |
兄弟 | 同一个双亲结点 |
森林 | 由N个互不相交的树构成深林 |
概念 | 描述 |
---|---|
结点的高度 | 结点到叶子结点的最长路径 |
结点的深度 | 根结点到该结点的边个数 |
结点的层数 | 结点的深度加1 |
树的高度 | 根结点的高度 |
树的分类 | 特性 |
---|---|
二叉树 | 1、一种特殊的树形结构,每个节点至多只有两颗子树 2、在二叉树的第N层上至多有2^(N-1)个结点。 3、最多有2^N-1个结点个数 |
全二叉树 | 除最后一层外,其他的结点个数必须达到最大,并且最后一层结点都连续靠左排列 |
满二叉树 | 除叶子结点外,每个结点都有左右两个子结点 |
二叉查找树 | 任意一个点的左子树小于该点,右子树大于该点 |
平衡二叉树 | 1、平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树, 可以保证查询效率较高。 2、具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 |
红黑树 | 1、每个结点不是红色就是黑色 2、不可能有连在一起的红色结点(黑色的就可以),每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据 3、根结点一定是黑色 4、每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点 |
B-Tree | 1、每个节点最多有 m 个子节点 2、除了根节点和叶子结点外,每个节点至少有 m/2 (向上取整,例如 3/2 = 1.5,这里取 2) 个子节点 3、若根节点不是叶子节点,那么根节点至少有2个子节点 4、所有的叶子都在同一层上 5、每个节点都包含 n 个 key,其中 m/2-1 <= n <= m-1 6、每个节点中的元素 key 从小到大排列,元素 key 的左节点的所有元素 key 值都小于等于元素 key,右节点的所有元素 key 值都大于等于元素 key |
B+Tree | 1、所有非叶子节点只存储 key 信息,不存储 data(数据信息) 2、所有 data (数据信息)都存储在叶子节点中 3、所有叶子节点之间都有一个链指针 4、所有叶子节点包含了全部元素(key+data)的信息 |
思考?为什么要分满二叉树和完全二叉树呢?因为通过定义可以看出,完全二叉树只是满二叉树里面的一个子集
要想清楚上面那个问题我们要从树形结构的存储开始。
B-Tree由来,以查找100w数据为例,数据太大存储在磁盘
- 平衡二叉查找树,如果100w条数据放入到二叉查找树中,假设树的高度为n,则20+21+22+23…+2(n-1)=(2n)-1=1000000,计算出来n为20
- 因此查找100w条数据中一个数据时最多需要查询20次即可。如果是在内存操作的话,查询效率还是蛮高的
- 但是数据库中的数据都是存放在磁盘上的,每读取一个节点就需要一次磁盘IO,这样子的话查找100w条数据中的一个数据时最多需要20次磁盘IO,20次磁盘IO,这个性能对于磁盘来说太慢了
- 那么有什么好的方法来解决这个问题呢?答案就是使用B-Tree,即将这棵树压缩一下,减少树的高度,每层上可以容纳更多的节点,这样子就会减少磁盘IO次数从而提高性能