二叉樹與哈夫曼樹

2021-07-07 05:20:03 字數 1748 閱讀 7512

1,二叉樹

二叉樹可以分為:完全二叉樹,滿二叉樹,哈夫曼樹;

二叉樹的遍歷:(遞迴)先序,中序,後序遍歷;

二叉樹的結構:根節點,左子樹,右子樹;

二叉樹的性質: 

(1). 如果二叉樹的節點個數為n,則父節點的個數為n/2;

(2).若2i+1

(3).若2i+2

二叉樹的構建:

// 構建二叉樹

public void createtreenode()

// 遍歷佇列,取出節點,生成二叉樹的葉子;

for (int i = 0; i < list.size() / 2; i++)

} }

二叉樹的遍歷方式:(遞迴演算法);

// 先序遍歷

public void pre(treenode root)

// 再拿到右子樹

treenode right = root.getrightnode();

if (right != null)

} // 中序遍歷

public void center(treenode root)

// 再訪問跟節點

system.out.print(root.getdata());

// 最後,拿到右子樹

treenode right = root.getrightnode();

if (right != null)

} // 後序遍歷

public void last(treenode root)

// 拿到右子樹

treenode right = root.getrightnode();

if (right != null)

// 最後,訪問跟節點

system.out.print(root.getdata());

} }

2.哈夫曼樹

(1)哈夫曼的性質:找出對應帶權路徑(wpl)最小的值是最優二叉樹 

(2)哈夫曼編碼:左子樹為0,右子樹為1,從樹的節點到分節點的路徑長度串起來的每個值;

(3) 構建哈夫曼樹   

public class hfmtree ;

public static void main(string args)

// 構建哈弗曼樹

public void createhfm()

// 列印出排序後的值

// for (int i = 0; i < list.size(); i++)

// 構建哈夫曼樹

while (list.size() > 1)

hfmcode(list.getfirst(), "");

} // 構建哈夫曼編碼

private void hfmcode(hfmnode root, string code)

if (root.getright() != null)

if (root.getleft() == null && root.getright() == null)

// return code;

} /**

* 定義索引下標的value值

*/// 該函式將返回乙個插入的索引

private int getindex(int value)

} return list.size();

}}



樹與二叉樹 哈夫曼樹

01 路徑和路徑長度 定義 在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第l層結點的路徑長度為l 1。例子 100和80的路徑長度是1,50和30的路徑長度是2,20和10的路徑長度是3。02 結點的權及帶...

哈夫曼樹(最優二叉樹)

給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...

哈夫曼樹及二叉樹

一 昨天寫了個哈夫曼樹,其實難到不難,重點是利用標準庫里的優先佇列就很好辦了 哈夫曼樹主要是建立個最小堆,求最小加權路徑,就是求哈夫曼樹中非葉子結點的權值和 include priority queueq 這個是最大堆 最小堆這樣寫 priority queue,greater q 另外,用vs20...