定义:
树(Tree): 是由n(>=0)个节点组成的有限集合
n = 0 时,为空树
树的根Root用r表示,其余的节点可以分为m(m>=0)个不相交的有限子集T1,T2...Tm,每个子集本身又是一棵树
术语:
1. 节点的度(degree): 某节点的子节点的个数
2. 树的度: 树中最大节点的度
3. 父节点(Parent) 子节点(Child) 兄弟节点(Sibling): 注意,兄弟节点之间要有共同的父节点
4. 叶节点: 度为0的节点
5. 路径: 从节点n1到节点nk所经过的节点 n1 n2 n3 ... nk组成的序列
6.路径长度: 路径包含边的数量
7. 树的层次Level: 定义根节点为1层,其他任意节点都是父节点+1层
8. 树的深度Depth:树中最大的层数
二叉树(重要)
二叉树的定义: (递归定义)
(1) 二叉树可以为空树
(2) 若不为空,其由根节点和其两个不相交的二叉树,左子树TL和右子树TR组成
也就是说,不为空的情况下,每个节点最大的度为2
二叉树的性质
1. 二叉树第k层(k>0)最多包含 个节点
2. 二叉树前k层(k>0)最多包含
个节点 (满二叉树的情况)
3. 任意二叉树 度为0的节点 n0 和度为2度的节点 n2之间的关系是 n0 = n2 + 1
4. 节点数为n的二叉树,其高度最小为 或
(完全二叉树的情况)
5. 节点数为n的二叉树,其高度最大为 n 即链表的情况
说明 性质3: 任意二叉树 度为0的节点 n0 和度为2度的节点 n2之间的关系是 n0 = n2 + 1
二叉树中存在度为 0 1 2 的节点 n0 n1 n2 总节点n = n0+n1+n2
二叉树每个节点上方链接线的数量为0*n0+1*n1+2*n2 + 1 (加上的是根节点上方没有链接线)
每个节点上方链接线的数量也等于n 可建立等式: n = n0+n1+n2 = n1+2*n2+1
有: n0 = n2 + 1
说明 性质4:
n个节点的二叉树,当为一个完全二叉树时,高度最小,满足不等式:
<= n <=
看左边 有 k-1 <=
k<=
+ 1
由于k是整数,有 k<=
看右边
k是整数 有:
最后得出 k =
=
满二叉树 & 完全二叉树
满二叉树,除了叶子结点,所有的节点的度都是2
完全二叉树,除了最后一层,每一层都达到最大节点数量,并且最后一层的叶子结点,必须从左到右连续存在,最多只能存在一个度为1的节点 (n1 = 1|0)
满二叉树一定是完全二叉树
完全二叉树不一定是满二叉树
性质:
1. 对于n节点的完全二叉树 / 满二叉树 其高度k为
或
2. k层满二叉树有 个节点
3. k层完全二叉树的节点数量n的范围是
4. n1 = 0 或 n1 = 1
5. n2 和 n0的关系满足
n为偶数时,n2=n/2 此时n1 = 1
n为奇树是 n2 = 此时n1 = 0
6. 若根节点编号为1 依次编号 则某节点i的左孩子为 2i 右孩子为2i+1 ,若2i>n 无左孩子 若2i+1>n则无右孩子。任意节点i的父节点为
二叉树的存储
完全二叉树 / 满二叉树可以使用数组表示 其中1为root的位置,以此类推
对于一般二叉树,使用数组会造成资源浪费,可以使用链表,如下方法
任何树,都可以通过孩子兄弟表示法转换成二叉树,如图所示:
孩子兄弟表示法也是React Fiber树的表示方法