树
树是一种数据结构,它是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
①每个节点有零个或多个子节点;
②没有父节点的节点称为根节点;
③每一个非根节点有且只有一个父节点;
④除了根节点外,每个子节点可以分为多个不相交的子树
术语
- 度: 结点所拥有的子树个数称为结点的度(Degree)
- 边: 一个结点和另一个结点之间的连接被称之为边(Edge)。
- 层次: 结点的层次(Level)从根(Root)开始定义起,根为第0层,根的孩子为第1层。以此类推,若某结点在第i层,那么其子树的根就在第i+1层。
- 结点的高度: 结点的高度是该结点和某个叶子之间存在的最长路径上的边的个数。
- 树的高度: 树的高度是其根结点的高度。
- 结点的深度: 结点的深度是从树的根结点到该结点的边的个数。(注:树的深度指的是树中结点的最大层次。)
种类
二叉树:每个节点最多含有两个子树的树称为二叉树;
完全二叉树:完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐。
二叉堆是一种特殊的二叉树,有以下两个特性。
它是一棵完全二叉树,表示树的每一层都有左侧和右侧子节点(除了最后一层的叶节点), 并且最后一层的叶节点尽可能都是左侧子节点,这叫作结构特性。
二叉堆不是最小堆就是最大堆。最小堆允许你快速导出树的最小值,最大堆允许你快速 导出树的最大值。所有的节点都大于等于(最大堆)或小于等于(最小堆)每个它的子 节点。这叫作堆特性。
满二叉树(完美二叉树):除了叶结点外每一个结点都有左右子叶且叶结点都处在最底层的二叉树,
二叉搜索树:二叉搜索树(BST)是二叉树的一种,但是只允许你在左侧节点存储(比父节点)小的值, 在右侧节点存储(比父节点)大的值。
BST 存在一个问题:取决于你添加的节点数,树的一条边可能会非常深;也就是说,树的一 条分支会有很多层,而其他的分支却只有几层,如下图所示。
为了解决这个问题, 有一种树叫作 Adelson-Velskii-Landi 树(AVL 树)。AVL 树是一种自平衡二叉搜索树(平衡二叉树)
平衡二叉树:
平衡二叉树是在构造二叉搜索树的过程中,每当插入一个新结点时,首先检查是否因插入新结点而破坏了二叉排序树的平衡性,若是,则找出其中的最小不平衡子树,在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。
平衡二叉树包括:AVL树,红黑树,Treap等
哈夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;
不关心树的结构,只要求带权值的路径达到最小值,哈夫曼树可能是完全二叉树也可能是满二叉树。