Ⅰ 求二叉树高度的原理、算法是什么,越详细越好,C语言,谢谢
首先分析二叉树的深度(高度)和它的左、右子树深度之间的关系。从二叉树深度的定义可知,二叉树的深度应为其左、右子树深度的最大值加1。由此,需先分别求得左、右子树的深度,算法中“访问结点”的操作为:求得左、右子树深度的最大值,然后加
1
。
int
Depth
(BiTree
T
){
//
返回二叉树的深度
if
(
!T
)
depthval
=
0;
else
{
depthLeft
=
Depth(
T->lchild
);
depthRight=
Depth(
T->rchild
);
depthval
=
1
+
(depthLeft
>
depthRight
?
depthLeft
:
depthRight);
}
return
depthval;
}
Ⅱ 二叉树最小权路径长度算法
问题描述:给定一棵树T,含有n个叶子节点,并且每个叶子节点都有一个权重值{A1,A2,A3...An}。目标是计算树T的最小权路径长度(WPL)。例如,2021年408这道题。
方法1:具体算法如下。举例说明。
首先构造哈夫曼树。哈夫曼树的构建顺序无需特定规则,但按照某种规律绘制可以更清晰地展示思路。这里我们以左节点作为顺序。
接着,依次累加所有叶子节点的带权路径长度。从构造的哈夫曼树中可以得知所有节点的路径长度,如“16”节点的路径长度为2。因此,WPL=(16+21+30)*2+(10+12)*3=200。
方法2:这里简要证明上述结论。
对于哈夫曼树T1中的两个兄弟叶子节点N1、N2,假设N1、N2的父节点为P1。N1的路径长度为d。删除N1、N2后得到的哈夫曼树为T2。计算得到W(N1)+W(N2)=N1+N2+(N1+N2)*(d-1)。由此得出W(P1)=P1*(d-1)=W(N1)+W(N2)+N1+N2。因此,W(T1)=W(T2)+N1+N2。
按照哈夫曼树构建过程,知道WPL(T1)=N1+N2+N3......+N,即WPL为所有叶子结点权重之和。
方法3:不绘制哈夫曼树直接计算WPL。按照方法2的过程,每次找到最小的两个节点后,直接累加到WPL里,并递归计算WPL。即WPL(T1)=min(n1+n2)+WPL(T2)。
代码实现:
JS实现:
C语言实现: