wpl值指的是一棵二叉樹所有葉子節點與其對應位置權重的總和,用遞迴的方法可以實現這一結果。但是目前網上的關於wpl值遞迴的演算法大多並不簡便,又或者是有問題的**,於是筆者在這裡自己寫了一段:
核心**:
void wpl_preorder(treelink t,int deep,int &wpl)
if(t->lchild)
if(t->rchild)
}
網上很多關於遞迴的演算法錯誤之處在於,忽略了累積節點深度時,由於回溯的過程而導致深度的不斷增加,因此整個每次計算的 權位積 只有乙個是正確的,而筆者給出每次遞迴完成後的deep-- 就是為了解決這一問題。
下面給出乙個完成程式,以實現通過輸入幾個權值,自動生成哈夫曼樹並且計算wpl值為例子:
#include#includetypedef struct node
*treelink,link;```
treelink creattree(int n);
void preord(treelink link);
treelink creathuffman(treelink link);
int wpld(treelink t);
void wpl_preorder(treelink t,int deep,int &wpl);
treelink creattree(int n)//通過輸入的葉子資訊,生成乙個遞增的鍊錶,為哈夫曼樹的生成做好準備
else
if(q==null) p->next=s;}}
return link;
}treelink creathuffman(treelink link)//將準備好的鍊錶進行合併與生成,轉化為哈夫曼樹
else
s=(treelink)malloc(sizeof(link));
s->weight=p->weight+q->weight;
s->lchild=p;
s->rchild=q;
s->next=null;
p=link;
q=p->next;
while(q!=null)
else
if(q==null)}}
free(link);
return s;
}void preord(treelink link)//先序遍歷二叉樹,作為觀測函式
}int wpld(treelink t)//列印wpl值
void wpl_preorder(treelink t,int deep,int &wpl)//核心部分
if(t->lchild)
if(t->rchild)
}int main()//主函式
遞迴法(非遞迴法)遍歷二叉樹
2.4 用 遞迴法 非遞迴法 實現先序遍歷 中序遍歷和後序遍歷函式,要求遍歷時能執行一定的操作,且該操作可由遍歷函式的呼叫者來設定。define tree type int typedef struct tree nodetreenode 先序遍歷與建立二叉樹 遞迴法 include tree.h ...
演算法與資料結構 二叉樹
二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...
資料結構與演算法 二叉樹
1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...