幾個技術問題,已知前序遍歷中序遍歷求後序遍歷,哈弗曼編碼,建立初始堆

一、已知前序遍歷、中序遍歷求後序遍歷(可參考:link
首先,對於
這裏寫圖片描述
前序遍歷:a->b->c(第一個字母是根節點)
中序遍歷:b->a->c
後序遍歷:b->c->a

例題:
已知
前序遍歷: GDAFEMHZ
中序遍歷: ADEFGHMZ
求後序遍歷
根據前序遍歷可知,G爲根節點,在中序遍歷中找到G,根據中序遍歷的特點可知,G前面的部分爲左子樹,後面部分爲右子樹,則可知:
這裏寫圖片描述
然後再看前序遍歷,可知D爲目前的左子樹的根節點,又從中序遍歷中可知,A爲左子樹,EF爲右子樹:
這裏寫圖片描述
同理可知F爲根節點:(爲何F爲左子樹而不是右子樹,因爲在中序遍歷中E在F的前面)
這裏寫圖片描述
對於右子樹HMZ同理可以得出:
這裏寫圖片描述

二、哈弗曼編碼(可參考:liink
(情況一)9 4 5 2構建哈夫曼樹
1、排序:2 4 5 9
2、挑選出最小的兩個數爲葉子構造樹:
這裏寫圖片描述
3、判斷上述計算出的根是否比 5以及9都要大,這裏不大,所以找出5、9中小的數繼續生長樹:
這裏寫圖片描述
4、最後讓樹繼續生長就可以了:
這裏寫圖片描述
權值就是:2*3(樹的層數)+4*3+5*2+9*1=37

( 情況二)6 13 18 7 30 16 構建哈夫曼樹
1、排序:6 7 13 16 18 30
2、挑選最小的兩個數當做葉子節點構建樹:
這裏寫圖片描述
2、13小於 16 18 30 所以繼續構建樹:
這裏寫圖片描述
3、26小於30,繼續構建樹:
這裏寫圖片描述
4、42大於18和30,分支生長:
這裏寫圖片描述
5、合併:
這裏寫圖片描述
權值就是:6*4+7*4+13*3+16*2+18*2+30*2=219

三、建立初始堆(可參考:link
一組記錄排序碼爲(5 11 7 2 3 17),則利用堆排序方法建立的初始堆爲
1、構建完全二叉樹
這裏寫圖片描述
2、原理就是調整a【i】>=a【2*i+1】&&a【i】>=a【2*i+2】(反之也可,就是小根堆):
這裏寫圖片描述

發佈了189 篇原創文章 · 獲贊 125 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章