树
在计算器科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
①每个节点有零个或多个子节点;
②没有父节点的节点称为根节点;
③每一个非根节点有且只有一个父节点;
④除了根节点外,每个子节点可以分为多个不相交的子树;
然后你要知道一大堆关于树的术语:度,叶子节点,根节点,父节点,子节点,深度,高度。
二叉树
二叉树:每个节点最多含有两个子树的树称为二叉树。(我们一般在书中试题中见到的树是二叉树,但并不意味着所有的树都是二叉树。)
算法实现
二叉树:
private static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
二叉树的遍历方式
先序遍历:先根节点->遍历左子树->遍历右子树
中序遍历:遍历左子树->根节点->遍历右子树
后序遍历:遍历左子树->遍历右子树->根节点
深度优先搜索(DFS)与广度优先搜索(BFS)
实现:bfs=队列,入队列,出队列 一次访问一条路径;dfs=栈,压栈,出栈 一次访问多条路径(来自知乎)
关系:用DFS解决的问题都可以用BFS解决。DFS易于编写(递归),时间消耗较少但是容易发生爆栈,而BFS可以控制队列的长度。
满二叉树
叶子节点都在同一层并且除叶子节点外的所有节点都有两个子节点。
完全二叉树
对于一颗二叉树,假设其深度为d(d>1)。除第d层外的所有节点构成满二叉树,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
PS:这里的满二叉树和完全二叉树取的是国内的定义,国外的定义不一样,有兴趣的可以去看看国外的定义。
平衡二叉树(AVL)
它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树,同时,平衡二叉树必定是二叉搜索树。
二叉查找树(二叉搜索树、BST)
若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
任意节点的左、右子树也分别为二叉查找树;
没有键值相等的节点。
霍夫曼树
带权路径最短的二叉树称为哈夫曼树或最优二叉树。
红黑树
红黑树是一颗特殊的二叉查找树,除了二叉查找树的要求外,它还具有以下特性:
- 每个节点或者是黑色,或者是红色。
- 根节点是黑色。
- 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
- 如果一个节点是红色的,则它的子节点必须是黑色的。
- 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
B-tree(B-树或者B树)
一颗m阶B树的特性:
- 根结点至少有两个子女(如果B树只有一个根节点,这个根节点的key的数量可以为[1~m-1])
- 每个非根节点所包含的关键字个数 j 满足:⌈m/2⌉ - 1 <= j <= m - 1,节点的值按非降序方式存放,即从左到右依次增加
- 除根结点以及叶子节点以外的所有结点的度数正好是关键字总数加1,故内部节点的子树个数 k 满足:⌈m/2⌉ <= k <= m
- 所有的叶子结点都位于同一层
假定:
m:B树的阶
n:非根的内部节点键的个数
t:m阶B树的节点能存在的最小的度
则有:
⌈m/2⌉ - 1 <= n <= m - 1
t - 1 <= n <= 2t -1
B+树
m阶B+树是m阶B-tree的变体,它的定义大致跟B-tree一致,不过有以下几点不同:
- 有n棵子树的结点中含有n个关键字,每个关键字不保存数据,只用来索引,所有数据都保存在叶子节点,其中⌈m/2⌉ <= n <= m
- 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接
- 所有的非终端结点可以看成是索引部分,结点中仅含其子树(根结点)中的最大(或最小)关键字
- 通常在B+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点
B*树
B*树是B+树的变体,除了B+树的要求之外,还有以下特性:
- ⌈m*2/3⌉ <= n <=m 这里的n是除根节点之外的内部节点的键
- 增加内部节点中兄弟节点的指针,由左边指向右边