参考书籍:严蔚敏《数据结构》223页
在此仅对书上的递推过程做一个直观的呈现。
次优二叉查找树类似于折半查找法,第一次寻得使数组左右趋于平衡的节点作为根节点--->再分别寻找左右两边的根节点……就构成了一个递归过程。
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
key | A | B | C | D | E | F | G | H | I | |
w | 0 | 1 | 1 | 2 | 5 | 3 | 4 | 4 | 3 | 5 |
sw | 0 | 1 | 2 | 4 | 9 | 12 | 16 | 20 | 23 | 28 |
dw | 27 | 25 | 22 | 15 | 7 | 0 | 8 | 15 | 23 |
如图,w为key的权值,sw为权值的累加,如D的权值累加sw(4) = w(4)+w(3)+w(2)+w(1)=sw(3)+w(4)=1+1+2+5=4+5=12;
dw的推导过程较难理解。假设D左(ABC)右(EFGHI)两边的权值和最接近,那么就有所有权值的和 - ABC权值和的两倍 - D的权值达到最小,即dw(D) = 所有权值的和 - ABC权值和的两倍 - D的权值, 可得:dw(4) = sw(9) - sw(3)*2 - w(4)。稍微变换一下,得到 dw(4) = sw(9) - sw(3) - sw(3) - w(4) = sw(9) - sw(3) - [ sw(3) + w(4) ] = sw(9) - sw(3) - sw(4)。
更一般地,令4为任意j,1为low,9为high,则有:dw(j) = sw(high) + sw(low-1) - sw(j) - sw(j-1)
sw(high) + sw(low-1)是定值,令dw = sw(high) + sw(low-1),dw = 28 + 0 = 28,那么可分别求得:
dw(1) =dw - sw(1) - sw(0) = 28 - 1 - 0 = 27
dw(2) = dw - sw(2) - sw(1) = 28 - 2 - 1 = 25
dw(3) = dw - sw(3) - sw(2) = 28 - 4 - 2 = 22
……
最终结果如上表所示。其中F的值最小,那么此二叉树的根节点便为F。以上是第一轮。接下来又要分别求F左右两边的根节点。此处仅以左边为例。
i | 0 | 1 | 2 | 3 | 4 | 5 |
key | A | B | C | D | E | |
w | 0 | 1 | 1 | 2 | 5 | 3 |
sw | 0 | 1 | 2 | 4 | 9 | 12 |
dw | 11 | 9 | 6 | 1 | 9 |
根据上面推导出来的公式:dw(j) = sw(high) + sw(low-1) - sw(j) - sw(j-1),其中dw = sw(high) + sw(low-1)。
此表中,high = 5,low = 1,dw = sw(high) + sw(low-1) = 12。特别注意此处是sw(low-1)
dw(1) =dw - sw(1) - sw(0) = 12 - 1 - 0 = 11
dw(2) = dw - sw(2) - sw(1) = 12 - 2 - 1 = 9
dw(3) = dw - sw(3) - sw(2) = 12 - 4 - 2 = 6
……
结果如上图所示,得到F的左节点为D。
以此类推,即可不断求得次优二叉查找树。推导过程如果出现负数,取绝对值。