树的种类(数据结构)

在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具备树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具备层次关系的集合。把它叫作“树”是由于它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具备如下的特色:算法

  •     每一个节点有零个或多个子节点;
  •     没有父节点的节点称为根节点;
  •     每个非根节点有且只有一个父节点;
  •     除了根节点外,每一个子节点能够分为多个不相交的子树;

一、二叉树

二叉树:每一个节点最多含有两个子树的树称为二叉树。(咱们通常在书中试题中见到的树是二叉树)数据库

在二叉树的概念下又衍生出满二叉树和彻底二叉树的概念数组

满二叉树:除最后一层无任何子节点外,每一层上的全部结点都有两个子结点。也能够这样理解,除叶子结点外的全部结点均有两个子结点。节点数达到最大值,全部叶子结点必须在同一层上。
彻底二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~(h-1)层) 的结点数都达到最大个数,第h层全部的结点都连续集中在最左边,这就是彻底二叉树。网络

 

算法实现数据结构

二叉树:
 private static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
TreeNode(int x) { val = x; }
}性能

二叉树的遍历方式优化

例:spa

 图1-1 一个二叉树的例子指针

前序遍历:根节点->遍历左子树->遍历右子树 blog

图1-1中的二叉树的前序遍历的顺序为{10,6,4,8,14,12,17}

中序遍历:遍历左子树->根节点->遍历右子树(能够理解为对根节点所在层的投影

图1-1中的二叉树的中序遍历的顺序为{4,6,8,10,12,14,17}

后序遍历:遍历左子树->遍历右子树->根节点

图1-1中的二叉树的中序遍历的顺序为{4,8,6,12,17,14,10}

这3种遍历都有递归和循环两种不一样的实现方法,每种遍历的递归实现都比循环实现要更简洁不少。

二、二叉查找树

二叉查找树是二叉树的衍生概念:

二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具备下列性质的二叉树:

  •    若任意节点的左子树不空,则左子树上全部节点的值均小于它的根节点的值;
  •    若任意节点的右子树不空,则右子树上全部节点的值均大于它的根节点的值;
  •    任意节点的左、右子树也分别为二叉查找树;

二叉查找树相比于其余数据结构的优点在于查找、插入的时间复杂度较低为 O ( log n ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。

三、 平衡二叉树(AVL树)

平衡二叉树:当且仅当任何节点的两棵子树的高度差不大于1的二叉树;

其中AVL树是最早发明的自平衡二叉查找树,是最原始典型的平衡二叉树。

平衡二叉树是基于二叉查找树的改进。因为在某些极端的状况下(如在插入的序列是有序的时),二叉查找树将退化成近似链或链,此时,其操做的时间复杂度将退化成线性的,即O(n)。因此咱们经过自平衡操做(即旋转)构建两个子树高度差不超过1的平衡二叉树。

三、红黑树

红黑树也是一种自平衡的二叉查找树。

经过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保从根到叶子节点的最长路径不会超过最短路径的两倍,用非严格的平衡来换取增删节点时候旋转次数的下降,任何不平衡都会在三次旋转以内解决

红黑树多用于搜索,插入,删除操做多的状况下

  •     每一个结点不是红的就是黑的。
  •     根结点是黑的。
  •     每一个叶结点都是黑的。
  •     每一个红色节点的两个子节点都是黑色。(从每一个叶子到根的全部路径上不能有两个连续的红色节点)
  •     对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。

四、B树

B-树就是B树,-只是一个符号.

B树(B-Tree)是一种自平衡的树,它是一种多路搜索树(并非二叉的),可以保证数据有序。同时它还保证了在查找、插入、删除等操做时性能都能保持在O(logn),为大块数据的读写操做作了优化,同时它也能够用来描述外部存储(支持对保存在磁盘或者网络上的符号表进行外部查找)

特色:

  • 定义任意非叶子结点最多只有M个儿子;且M>2
  • 根结点的儿子数为[2, M]
  • 除根结点之外的非叶子结点的儿子数为[M/2, M]
  • 每一个结点存放至少M/2-1(取上整)和至多M-1个关键字;(至少2个关键字)
  • 非叶子结点的关键字个数=指向儿子的指针个数-1
  • 非叶子结点的关键字:K[1], K[2], …, K[M-1];且K[i] < K[i+1]
  • 非叶子结点的指针:P[1], P[2], …, P[M],其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1], K[i])的子树
  • 全部叶子结点位于同一层

B+树

B+树是B-树的变体,也是一种多路搜索树
B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树能够在非叶子结点命中),其性能也等价于在关键字全集作一次二分查找;

B+的特性:

  • 全部关键字都出如今叶子结点的链表中(稠密索引),且链表中的关键字刚好是有序的
  • 不可能在非叶子结点命中
  • 非叶子结点至关因而叶子结点的索引(稀疏索引),叶子结点至关因而存储(关键字)数据的数据层
  • 更适合文件索引系统

使用场景:

文件系统和数据库系统中经常使用的B/B+ 树,他经过对每一个节点存储个数的扩展,使得对连续的数据可以进行较快的定位和访问,可以有效减小查找时间,提升存储的空间局部性从而减小IO操做。

他普遍用于文件系统及数据库中,如:
Windows:HPFS 文件系统
Mac:HFS,HFS+ 文件系统
Linux:ResiserFS,XFS,Ext3FS,JFS 文件系统
数据库:ORACLE,MYSQL,SQLSERVER 等中

对比

B树:有序数组+平衡多叉树 B+树:有序数组链表+平衡多叉树

B+ 树的优势:

  1. 层级更低,IO 次数更少
  2. 每次都须要查询到叶子节点,查询性能稳定
  3. 叶子节点造成有序链表,范围查询方便
相关文章
相关标签/搜索