在计算器科学中,树(英语: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 ) 。二叉查找树是基础性数据结构,用于构建更为抽象的数据结构,如集合、多重集、关联数组等。
平衡二叉树:当且仅当任何节点的两棵子树的高度差不大于1的二叉树;
其中AVL树是最早发明的自平衡二叉查找树,是最原始典型的平衡二叉树。
平衡二叉树是基于二叉查找树的改进。因为在某些极端的状况下(如在插入的序列是有序的时),二叉查找树将退化成近似链或链,此时,其操做的时间复杂度将退化成线性的,即O(n)。因此咱们经过自平衡操做(即旋转)构建两个子树高度差不超过1的平衡二叉树。
红黑树也是一种自平衡的二叉查找树。
经过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保从根到叶子节点的最长路径不会超过最短路径的两倍,用非严格的平衡来换取增删节点时候旋转次数的下降,任何不平衡都会在三次旋转以内解决
红黑树多用于搜索,插入,删除操做多的状况下
B-树就是B树,-只是一个符号.
B树(B-Tree)是一种自平衡的树,它是一种多路搜索树(并非二叉的),可以保证数据有序。同时它还保证了在查找、插入、删除等操做时性能都能保持在O(logn),为大块数据的读写操做作了优化,同时它也能够用来描述外部存储(支持对保存在磁盘或者网络上的符号表进行外部查找)
特色:
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+ 树的优势: