Ⅰ 求二叉樹高度的原理、演算法是什麼,越詳細越好,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語言實現: