树的基本知识
树
定义:
树:树是一个
性质:
-
树是递归定义的。
-
一棵树中至少有一个结点。
-
除根节点外,其他所有结点都拥有前驱;除叶结点外,其他所有结点都拥有后继。
-
树只能有一个前驱,可以有多个后继。
结点:(又称节点)指树中元素。
结点的度:指树中某元素的子树个数。
树的度:指树中最大的结点度。
叶节点:指无子树的结点。
根节点:指无父节点的结点。
深度:指最长父子关系(最大父子关系的长度),根节点深度为
结点深度:指某结点与子树的最长父子关系(最大父子关系的长度)
高度:指最长父子关系(最大父子关系的长度),叶节点高度为
结点高度:指某结点与子树的最长父子关系(最大父子关系的长度)
二叉树:
定义:任何一个结点最多拥有
性质:
-
二叉树的第
i 层最多有2^{i-1} 个结点证明:当i=1时绝对成立;现在假设i-1层时由推断成立,即第i-1层最多有2^(i-2)个结点。根据「二叉树的定义」,则第i层的节点数为i-1层的二倍,即为2^(i-2)*2=2^(i-1)。 -
深度为
k 的二叉树最多有2^{k}-1 个结点证明:深度相同的两棵二叉树,当每一层节点数为最大时,节点数最多。根据「性质1」可得深度为k的二叉树节点数最多为: 2^0+2^1+2^2+……+2^(k-1)+2^k整合即为:2^k-1 -
对于任意一棵二叉树,如果度为
0 的结点(叶节点)数量为n_{0} ,度为2 的结点数量为n_{2} ,则一定满足n_{0}=n_{2}+1 证明:因为「二叉树的定义」,所以n=n_0+n_1+n_2(n为结点总数,暂时将此式记为「式1」) 又得知,树中结点总数为孩子结点数+根节点 孩子结点数即为:n_1+2n_2 即n=n_1+2n_2+1(暂时将此式记为「式2」) 根据「式1」与「式2」,我们又双叒叕可以得到: ∵「式1」 ∴n_0=n-n_1-n_2 将「式2」代入,得出: n_0=n_1+2n_2+1-n_1-n_2 =n_2+1 -
具有n个结点的完全二叉树,深度为
⌊log_2^n⌋+1 证明:设树深度为k,根据完全二叉树的定义(后文有写到),1~(k-1)层一定是满的,所以节点数n>2^(k-1)-1,但n又需满足n<=2^k-1,所以2^(k-1)-1<n<=2^k-1,即为2^(k-1)<=n<2^k 加入log运算后: k-1<=log2(n)<k,但k是整数,log2(n)是实数,所以k=floor(log2(n)+1),即为k=⌊log2(n)⌋+1
满二叉树:
每个非叶节点的结点都拥有左子树与右子树,且叶节点都在同一层。简单地说,深度为
满二叉树性质:
- 每层上的节点数都是最大节点数。
完全二叉树:
深度为
二叉树的遍历:
-
先序遍历(先根遍历):(递归定义)根->左子树->右子树
-
中序遍历(中根遍历):(递归定义)左子树->根->右子树
-
后序遍历(后根遍历):(递归定义)左子树->右子树->根
见图片
霍夫曼树(Huffman):
霍夫曼树(哈夫曼树),又称最优二叉树,用于建造Huffman编码。Huffman编码是一种前缀编码;Huffman编码是建立在Huffman树的基础上进行的,因此为了进行Huffman编码,必须先构建Huffman树;编码的路径长度是每个叶节点到根节点的路径之和;带权路径长度是每个叶节点的路径长度
构建方法:直接上图,懒得解释
构成Huffman编码后,原本权值高的数编码短;原本权值低的数编码长
树的直径: 树的直径,又称树的最长链,定义为一棵树上最远的两个节点的路径,即树上一条不重复经过某一条边的最长的路径。树的直径也可以代指这条路径的长度。
习题:
树(含盖下面所有题目的题单)
基础二叉树结构练习:P4715 【深基16.例1】淘汰赛
求二叉树的深度:P4913 【深基16.例3】二叉树深度
Huffman:练习题目:P2168 [NOI2015] 荷马史诗
树上搜索:P1364 医院设置
树的遍历:P1305 新二叉树
树的遍历:P1030 [NOIP2001 普及组] 求先序排列
树上距离,
树上搜索(爆料:N%K Problem):P3915 树的分解
树上搜索:P2052 [NOI2011] 道路修建
树形dp:P1122 最大子树和