树的定义
树是n(n>=0)个节点的有限集合。当n=0时,称为空树。
任意非空树满足的条件:
- 有且仅有一个根结点。
- 当n>1时,其余节点可以分为m(m>0)个互不相交的有限集合,其中每一个集合本身又是一棵树,称为结点的子树。
基本术语
前驱结点(父结点、双亲结点)和后继结点(子结点、孩子结点):
-
树的根节点没有前驱结点,但其它结点有且只有一个前驱节点。
-
任何一个结点都可以有零个或者多个后继结点。
-
n个结点的树只有n-1条边(每个结点都连接一个父节点,但根节点没有)。
祖先结点和子孙结点:
- 祖先结点:从根结点到结点E的唯一路径上的任意结点,称为结点E的祖先结点。
- 子孙结点:相对应的,如果A结点是B结点的祖先结点,那么B节点就是A结点的子孙节点。
兄弟结点:
- 两个结点的父结点相同。
叔叔结点:(红黑树的时候会遇到)
- 该结点的父节点的父节点的子结点。
度:
- 度:树中一个结点的子结点的个数称为该结点的度。
- 树的度:树中最大度数(结点最大的度)为树的度。
- 分支结点:度大于0的结点(有子结点)。
- 叶子结点:度为0的结点(没有子结点)。
结点的层数、高度、深度:(搜了一些相关的计算问题,从0还是1开始算貌似没有明确规定,具体问题还是要看具体题目要求)
- 结点的层数:看下面的图,层数会从1或者0开始数,要看题目规定。
- 结点的深度:对于任意节点n,n的深度为从根到n的唯一路径长,根的深度为0。(维基百科)
- 结点的高度:对于任意节点n,n的高度为从n到一片树叶的最长路径长,所有树叶的高度为0。(维基百科)
- 树的高度(深度):树的高度和深度等于它最深的树叶的深度
有序树和无序树:
- 无序树:树中任意节点的子结点之间没有顺序关系,这种树称为无序树,也称为自由树。
- 有序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树。
- 交换同一个父结点下的两个兄弟结点子树,交换前和交换后如果是无序树的话就是同一种树,如果是无序树则是两个不同的树。
路径:
- 路径:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的。
- 树中的分支是有向的,从父结点指向子结点,所以路径一定是自上而下的。
- 路径长度:路径上所经历边的个数。
森林:
- n(n>=0)棵互不相交的树的集合。
n叉树:
- n叉树,每个子结点最多n个。
子树和子结构:(剑指offer遇到了判断树的子结构)
- 子树:只要包含了一个结点,就得包含这个结点下的所有节点。
- 子结构:包含了一个结点,可以只取左子树或者右子树,或者都不取。
树的性质
- n个结点的树只有n-1条边(每个结点都连接一个父节点,但根节点没有)。
- 树中的结点数等于所有结点的度数加一(原理和上面一条一样)。
- 度为m的树中第i层最多有m^(i-1)个节点(每个结点的度都为m情况下考虑)。
- 高度为h的m叉树至多(m^h-1)/(m-1)个节点(每个结点的度都为m情况下考虑,等比数列求和)。
- 具有n个节点的m叉树的最小高度为logm( n(m-1) + 1 ) 向上取整(除了最后一层结点可能不满,其它层都为满,用上面一条公式求高度,向上取整)。