一、已知前序遍歷、中序遍歷求後序遍歷(可參考: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】(反之也可,就是小根堆):