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