資料結構與演算法 遞迴法計算二叉樹的WPL值

2021-09-01 09:13:50 字數 1388 閱讀 5788

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...