文章目录
(树)Tree–ADT
树相关的定义
树是由 n ( n>=0 )个节点构成的有限集合
- n=0 时,为空树
- n>0 时,有且仅有一个节点称为根,而其他为互不相交的有限集,其中每个子集本身又是一棵树
根(root)
没有双亲的节点 [eg. A],树可以只有一个节点
子树(孩子 | sub-tree)
双亲的孩子 [eg. B C D是 A的孩子]
兄弟(sibling)
拥有相同双亲的节点[eg. B C D]
叶节点( leaf )
没有子树的节点
-
终端节点(叶节点)
度为0的节点
-
非终端节点(分支节点)
度不为0 的节点
层次( level )
规定根节点的层次为0,其余节点依次递增 1 (有些版本规定根为 1)
度( 边数 | degree )
- 节点的度
节点的孩子数,或称节点有多少条边
- 树的度
取所有节点中最大的度
高度 ( height )
- 节点的高度
该节点沿着所在路径,到达最深节点(叶节点)所经过的路径长,
例如 : 上图中 节点 ④ ④ ④ 的高度为 1
- 树的高度
取所有节点中最大的那一个高度
例如 :上图中 树的高度 为 2(根结点 ② − > ⑤ ②->⑤ ②−>⑤)
深度 ( depth )
规定根的深度为 0
- 节点的深度
-
Way 1
从根节点出发,沿着该节点所在路径寻找,直到到达该节点,期间经过的路径长 [从根到该节点的路径长]
-
Way 2
节点所在的层次,即为该节点的深度
例如 : 上图中节点 ⑤ ⑤ ⑤ 的深度为 2
- 树的深度
-
Way 1
从根节点出发,到达所有叶子节点最长的路径长
-
Way 2
最大层次数,即为该树的深度
例如 :上图中树的深度为 2
归纳:一棵树的深度和高度是相等的,但树的节点(除根节点)的深度和高度未必相等
树的性质
将 度为 m 的树称为 m次树
- 树的节点数 = 所有节点的度数之和+1
典型分析:已知一棵度为m的树中有 n 1 n_1 n1个度为1的节点, n 2 n_2 n2个度为2的节点… n m n_m nm个度为m的节点,求该树中有多少个叶子节点?
叶子节点:度为0
所有节点的度数之和=叶子节点的度数之和+非叶子节点度数之和=非叶子节点度数之和
非叶子节点度数之和=1* n 1 n_1 n1+2* n 2 n_2 n2+3 n 3 n_3 n3+…+m n m n_m nm
叶子节点数 =树的节点数 - 非叶子节点数(度>0)
=1 n 2 n_2 n2+2 n 3 n_3 n3…+(m-1) n m n_m nm+1
-
度为 m 的树中第 i i i 层上 <至多> 有 m i − 1 m^{i-1} mi−1 个节点 ( i>=1 ,即是 level 从 1 开始数)
推广 :
- 若某一层有 m i − 1 m^{i-1} mi−1 个节点,则称该层是满的。
- 所有叶子节点在同一层,且除该层以外的每一层都是满的,则称为 满 m 次树
- 满 m 次树是所有相同高度的 m 次树中节点总数最多的树,即 对于 n 个节点的,构造的 m次树 为满 m次树或接近 m次树时,高度最小
-
高度为 h 的树 <至多> 有 m h − 1 m − 1 \frac{m^h-1}{m-1} m−1mh−1 个节点
典型分析:若三叉树 T 中有 244 个结点(叶结点的高度为 1 ), 则 T 的高度至少是?
三叉树:度至多为3的树
- way 1:
前面得知:当每层都为满时,树的高度最小
则 只要求出每层的节点和 恰好大于题目所给节点即可
又 每层节点之和为 3 0 + 3 1 + 3 2 + . . . 3 h = 3 0 ( 1 − 3 h + 1 ) / ( 1 − 3 ) 3^0+3^1+3^2+...3^h=3^0(1-3^{h+1})/(1-3) 30+31+32+...3h=30(1−3h+1)/(1−3)
故 h >=6
- way 2:
高度为 h 的树至多有 m h − 1 m − 1 \frac{m^h-1}{m-1} m−1mh−1 个节点
故 只需求出 h 满足在题目所给的节点即可
同样 可求出 h >=6
- 有 n 个节点的 m 次树 的最小的高度为 l o g m n ( m − 1 ) + 1 log_m{n(m-1)+1} logmn(m−1)+1
典型分析:含有 n 个节点的 4 次树的最小高度是多少?最大高度是多少?
M i n h Min_h Minh= l o g 4 log_4 log4(3n+1)
四次树 :至少有一个节点度为 4 的树
若取 一个节点的度为 4,其它节点均为 1,那么这样的树就有最大高度
则 M a x h Max_h Maxh=n-4+1
树的遍历
先根遍历(preorder traversal)
- 先访问根节点
- 再自左向右访问子节点
后根遍历(postoder traversal)
- 先自左向右访问子节点
- 再访问根节点
层序遍历(level traversal)
- 从根节点开始,自上向下,自左向右 有序访问节点
特殊的树及相关性质
在树中的 所有 术语对于特殊的树同样适用
二叉树
- 有限集合
- 为空 或者 由一个根节点和两个互不相交的二叉树构成(子树称为 左子树 和 右子树)
思考:二叉树 与 度为 2 的树的区别?
- 度为 2 的树中至少有一个节点度为 2 ,而二叉树中没有这种要求
- 度为 2 的树不区分左、右子树,而二叉树 严格 区分
性质:
- 非空二叉树的第 i 层上 至多 有 2 i − 1 2^{i-1} 2i−1个节点( i >=1) 【由树的性质 2 推出】
- 高度为 h 的二叉树 至多 有 2 h − 1 2^{h-1} 2h−1 个节点 ( h>=1 ) 【由树的性质 3 推出】
严格二叉树
- 每个节点的 度 严格为 0 或者 2 的树
满二叉树 与 完全二叉树
满二叉树 :所有分支节点(非叶子节点)的度都为 2 ,且叶子节点都集中在同一层
特点:
- 叶子都在同一层
- 只有度为 0 或 2 的节点
完全二叉树:
-
在 满二叉树的基础上,对其 自上而下,自左向右 编号 (层序编号)
-
中间不能缺失节点,即除了最下层,其他层必须填满
特点:
-
叶子只可能出现在最下层
-
最下层的叶子,自左向右 依次排列
-
有且仅可能有一个 度为 1 的节点,且其为左孩子
-
一旦出现编号 为 i 的节点为 叶子 或 只有左孩子,则编号大于 i 的节点均为 叶子
-
根据节点总数 n
(1) n%2 !=0, n 1 n_1 n1=0 (度为 1 的节点数为 0)
(2) n%2 ==0, n 1 n_1 n1=1
性质:
- 在完全二叉树中,对于节点数为 n (n>=1),层序编号 为 i ( i >=1&& i<= n)的节点
-
当 i >** n 2 \frac{n}{2} 2n**时,为叶子节点
-
若 n 为奇数 ,则分支节点既有左孩子,又有右孩子
若 n 为偶数,则编号为** n 2 \frac{n}{2} 2n**的节点只有左孩子,无右孩子,且其余 分支节点 均有左、右孩子
- 具有 n (n>0)个节点的完全二叉树的高度为 l o g 2 log_2 log2(n+1) 或者 l o g 2 log_2 log2n + 1