浅谈数据结构之树,之后不再怕面试官问了!

本篇只涉及树的概念范围和应考思路,不涉及具体结构或算法的实现与思考,具体的结构或算法会在后面跟新。

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

特色:

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

浅谈数据结构之树,之后不再怕面试官问了!
而后你要知道一大堆关于树的术语:度,叶子节点,根节点,父节点,子节点,深度,高度。面试

二叉树

二叉树:每一个节点最多含有两个子树的树称为二叉树。(咱们通常在书中试题中见到的树是二叉树,但并不意味着全部的树都是二叉树。)算法

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

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

算法实现(见笑)数组

二叉树:数据结构

private static class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
TreeNode(int x) { val = x; }
}

二叉树的遍历方式ide

先序遍历:先根节点->遍历左子树->遍历右子树性能

中序遍历:遍历左子树->根节点->遍历右子树编码

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

浅谈数据结构之树,之后不再怕面试官问了!
4

深度优先搜索(DFS)与广度优先搜索(BFS)

实现:bfs=队列,入队列,出队列 一次访问一条路径;dfs=栈,压栈,出栈 一次访问多条路径(来自知乎)

关系:用DFS解决的问题均可以用BFS解决。DFS易于编写(递归),时间消耗较少可是容易发生爆栈,而BFS能够控制队列的长度。

2.动态查找树

2.1 二叉查找树

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

二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具备下列性质的二叉树:
1若任意节点的左子树不空,则左子树上全部节点的值均小于它的根节点的值;
2.若任意节点的右子树不空,则右子树上全部节点的值均大于它的根节点的值;
3.任意节点的左、右子树也分别为二叉查找树;
4.没有键值相等的节点。

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

2.2 平衡二叉树(AVL树)

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

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

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

具体能够参阅1962年G.M. Adelson-Velsky 和 E.M. Landis的论文"An algorithm for the organization of information"。(这个坑我会之后补)

2.3 红黑树

红黑树也是一种自平衡的二叉查找树。
1.每一个结点要么是红的要么是黑的。(红或黑)
2.根结点是黑的。 (根黑)
3.每一个叶结点(叶结点即指树尾端NIL指针或NULL结点)都是黑的。 (叶黑)
4.若是一个结点是红的,那么它的两个儿子都是黑的。 (红子黑)
5.对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。(路径下黑相同)

浅谈数据结构之树,之后不再怕面试官问了!

如图就是一棵典型的红黑树。保证红黑树知足它的基本性质,就是在调整数据结构自平衡。

而红黑树自平衡的调整操做方式就有旋转和变色两种。

红黑树是一种应用很广的数据结构,如在Java集合类中TreeSet和TreeMap的底层,C++STL中set与map,以及linux中虚拟内存的管理。

2.4 哈夫曼树(Huffman Tree)

哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。

通常能够按下面步骤构建:

1,将全部左,右子树都为空的做为根节点。
2,在森林中选出两棵根节点的权值最小的树做为一棵新树的左,右子树,且置新树的附加根节点的权值为其左,右子树上根节点的权值之和。注意,左子树的权值应小于右子树的权值。
3,从森林中删除这两棵树,同时把新树加入到森林中。
4,重复2,3步骤,直到森林中只有一棵树为止,此树即是哈夫曼树。

你们可能更多据说的是哈夫曼编码,其实就是哈夫曼树的应用。即如何让电文中出现较多的字符采用尽量短的编码且保证在译码时不出现歧义。
浅谈数据结构之树,之后不再怕面试官问了!

3.多路查找树

大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(若是元素数量很是多的话,查找就退化成节点内部的线性查找了),这样致使二叉查找树结构因为树的深度过大而形成磁盘I/O读写过于频繁,进而致使查询效率低下。

3.1 B树

B树(英语:B-tree)是一种自平衡的树,可以保持数据有序。这种数据结构可以让查找数据、顺序访问、插入数据及删除的动做,都在对数时间内完成。B树,归纳来讲是一个通常化的二叉查找树(binary search tree),能够拥有最多2个子节点。与自平衡二叉查找树不一样,B树适用于读写相对大的数据块的存储系统,例如磁盘。
1.根结点至少有两个子女。

2.每一个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m

3.每个叶子节点都包含k-1个元素,其中 m/2 <= k <= m

4.全部的叶子结点都位于同一层。

5.每一个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

浅谈数据结构之树,之后不再怕面试官问了!
如图所示就是一颗符合规范的B树,因为相比于磁盘IO的速度,内存中的耗时几乎能够省略,因此只要树的高度足够低,IO次数足够小,就能够提高查询性能。

B树的增长删除一样遵循自平衡的性质,有旋转和换位。

B树的应用是文件系统及部分非关系型数据库索引。

3.2 B+树

B+ 树是一种树数据结构,一般用于关系型数据库(如Mysql)和操做系统的文件系统中。B+ 树的特色是可以保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+ 树元素自底向上插入,这与二叉树刚好相反。

在B树基础上,为叶子结点增长链表指针(B树+叶子有序链表),全部关键字都在叶子结点 中出现,非叶子结点做为叶子结点的索引;B+树老是到叶子结点才命中。

b+树的非叶子节点不保存数据,只保存子树的临界值(最大或者最小),因此一样大小的节点,b+树相对于b树可以有更多的分支,使得这棵树更加矮胖,查询时作的IO操做次数也更少。
浅谈数据结构之树,之后不再怕面试官问了!
这一般在多数节点在次级存储好比硬盘中的时候出现。经过最大化在每一个内部节点内的子节点的数目减小树的高度,平衡操做不常常发生,并且效率增长了。

3.3 B*树

B*树是B+树的变体,在B+树的非根和非叶子结点再增长指向兄弟的指针

在B+树基础上,为非叶子结点也增长链表指针,将结点的最低利用率从1/2提升到2/3。

3.4 R树

R树是用来作空间数据存储的树状数据结构。例如给地理位置,矩形和多边形这类多维数据创建索引。

R树的核心思想是聚合距离相近的节点并在树结构的上一层将其表示为这些节点的最小外接矩形(MBR),这个最小外接矩形就成为上一层的一个节点。由于全部节点都在它们的最小外接矩形中,因此跟某个矩形不相交的查询就必定跟这个矩形中的全部节点都不相交。叶子节点上的每一个矩形都表明一个对象,节点都是对象的聚合,而且越往上层聚合的对象就越多。也能够把每一层看作是对数据集的近似,叶子节点层是最细粒度的近似,与数据集类似度100%,越往上层越粗糙。

浅谈数据结构之树,之后不再怕面试官问了!

相关文章
相关标签/搜索