java自定義二叉樹續 霍夫曼樹和將數學算式建樹

2021-08-31 15:41:25 字數 1779 閱讀 8901

1.霍夫曼樹和霍夫曼編碼

霍夫曼樹即最優二叉樹,因為它每個葉子結點到根結點的距離與葉子結點的權值有關,往往此權值越大,它的路徑越短,即帶權路徑長度要保持最小,所以叫它最優二叉樹。

[quote]   (1)設給定的一組權值為,據此生成森林f=,f 中的每棵二叉樹只有乙個帶權為wi的根節點(i=1,2,……n)。

演算法思想為:

(2)在f中選取兩棵根節點的權值最小和次小的二叉樹作為左右構造一棵新的二叉樹,新二叉樹根節點的權值為其左、右子樹根節點的權值之和。

(3)在f中刪除這兩棵最小和次小的二叉樹,同時將新生成的二叉樹併入森林中。

(4)重複(2)(3)過程直到f中只有一棵二叉樹為止。[/quote]

以下為**:

結點類的補充

private string code = " ";

public string getcode()

public void setcode(string code)

核心**:

/**

* 按照傳入的陣列建立霍夫曼樹的方法 通過優先佇列實現

* * @param arr

* 傳入的整型陣列

*/public void creathuffmantree(int arr) else

while (que.size() > 1)

root = que.poll();}}

/*** 列印此樹的霍夫曼編碼

* * @param node

* 由指定位置開始做為根結點

* */

public void printhcode(tnode node) else else

}}

2.將算術表示式建成樹

在這段**中主要通過將原本的**轉換為逆波蘭表示式,以去除括號,然後轉換為波蘭表示式(波蘭表示式將運算子寫在前面,運算元寫在後面,便於建樹),建成樹。計算時只需要後序遍歷就可以簡單的計算這個數學算式。

**如下:

/**

* 將乙個數學算式轉化為乙個樹

* * @param s

* 此算式的字串

*/public void aftotree(string s) else if (cha == '(') else if (cha == ')')

} else

sta.push(cha);}}

char c = sta.pop();

while (c != '#')

// 將逆波蘭轉化為波蘭表示式

char temp = new char[j + 1];

for (int i = 0; i < j; i++)

temp[j] = '#';

// 由波蘭表示式建樹

root = creataftree(temp);

}/**

* 將波蘭表示式建成一棵樹

* * @param ch

* @param key

* @return

*/public tnode creataftree(char ch) else

tnode temp2 = creataftree(ch);

if (temp2 == null) else

return current;

} else

} else

}

java自定義二叉樹

今天學習的是二叉樹的相關知識。二叉樹是樹的一種,因為他每個結點最多只有2個子結點,所以叫做二叉樹。鍊錶實際上很像是樹的特殊情況。二叉樹有很多種,其中著名的就有二叉查詢樹和霍夫曼樹。quote 二叉樹在圖論中是這樣定義的 二叉樹是乙個連通的無環圖,並且每乙個頂點的度不大於2。有根二叉樹還要滿足根結點的...

完全二叉樹與滿二叉樹與霍夫曼樹

去筆試了很多次,每次都有有關於二叉樹的題目,而且其中最多的是關於完全二叉樹,然而完全二叉樹在哥心中的形態一直很模糊,究其原因是我把完全二叉樹和滿二叉樹搞混了。其實滿二叉樹是完全二叉樹的特例,因為滿二叉樹已經滿了,而完全並不代表滿。所以形態你也應該想象出來了吧,滿指的是出了葉子節點外每個節點都有兩個孩...

自定義二叉搜尋樹

public class binarysearchtree private node root insert 1.判斷根節點是否存在,不存在則建立新的根節點 2.根據二叉搜尋樹的性質 左節點 根節點 右節點 進行一種正確的插入方式 public void insert int val node pa...