題目:二叉樹的帶權路徑長度(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
}
遞歸函數應該有:遞歸體,遞歸出口