1. 程式人生 > >真題2002 2017 求二叉樹的帶權路徑長度

真題2002 2017 求二叉樹的帶權路徑長度

題目:二叉樹的帶權路徑長度(WPL)是二叉樹中所有葉節點的帶權路徑長度之和。給定一個二叉樹T,採用二叉連結串列儲存,節點結構為:
left weight right
其中葉結點的weight域儲存該節點的非負權值。設root為指向T的根節點的指標,設計求WPL的演算法。
解答:
基本設計思想:基於深度優先遍歷的演算法設計思想是用一個static變數記錄WPL,把每個節點的深度作為遞迴函式的一個引數傳遞;
步驟:若該結點是葉節點,那麼變數加上該節點的深度與權值之和
若是非葉節點,那麼若左子樹不為空,對左子樹呼叫遞迴演算法;若右子樹不為空,對右子樹呼叫遞迴演算法;
最後返回計算出的WPL即可。

Typedef struct Binode{
	Int weight;
    Struct lode*left,*right; 
}Binode,*bitree;
Datatype wpl(bitree  root,int deep){
	Int depth=0;                            //初始設二叉樹的深度為0
	If(root->left==null&&root->right==null)      //當為葉節點時,積累WPL
		Wpl+=root->weight*depth;         
	If(root->left!=null)                   //若節點的左子樹存在,遞迴遍歷
		wpl(root->left,depth+1)
		If(root->right!=null)                  //若節點的右子樹存在,遞迴遍歷
		wpl(root->right,depth+1)
		Return wpl;                      //最後返回計算所得值wpl
}

遞迴函式應該有:遞迴體,遞迴出口