15.5-1
CONSTRUCT-OPTIMAL-BST(root)
n ← length[root]
print r[1, n] is the root
PRINT-OBST(1, n)
PRINT-OBST(i, j)
dm−1
m = r[i, j]
if i = m
print is the left child of
km
kr[i,m−1]
else
printis the left child of
km
dm
PRINT-OBST(i, m-1)
if j = m
print is the right child of
km
kr[m+1,j]
else
print is the right child of
km
PRINT-OBST(m+1, j)
15.5-2
最右二叉搜索树如下图:
最后计算的代价为:3.12。
15.5-3
若有
ω
表,每次计算
ω[i,j]
只需要
Θ(1)
时间,没有维护表则需要
Θ(j−i)
时间,所以现在相当于在第二个 for
里面再加一个 for
循环(不是嵌套在第三个 for
循环中),最后的复杂度依然是
Θ(n3)
。
15.5-4
第9、10行替换为:
if i = j
pi+qi−1+qj
r = j
e[i,j]=
else
for r = root[i,j-1] to root[i+1,j]
在计算所有的
j−i=k
的e[i,j]
时(含有
k
个结点),每个e[i,j]
需要花费 root[i+1, j] – root[i, j-1] + 1
次迭代,所有的e[i,j]
花费root[k,1] – root[1,k] + n – k
。由于1 ≤ root[k, 1], root[1, k] ≤ n
,所以root[k,1] – root[1,k] + n – k=Θ(n)
。最后
k
的变化范围是