>>算法导论P217
def Optimal_BST(p,q,n): e=[[0 for col in range(n+1)]for row in range(n+2)] #期望代价 w=[[0 for col in range(n+1)]for row in range(n+2)] #概率总和 root=[[0 for col in range(n+1)]for row in range(n+2)] #根节点 for i in range(1,n+2): e[i][i-1]=q[i-1] w[i][i-1]=q[i-1] for L in range(1,n+1): for i in range(n-L+2): j=i+L-1 e[i][j]=float('inf') w[i][j]=w[i][j-1]+p[j]+q[j] for r in range(i,j+1): #可用Knuth结果改进算法复杂度 t=e[i][r-1]+e[r+1][j]+w[i][j] if t<e[i][j]: e[i][j]=t root[i][j]=r Construct_Optimal_BST(root,1,n,n,0) return 0 def Construct_Optimal_BST(root,i,j,n,count): count+=1 if count>(2*n+1): return if i==1 and j==n: print('K'+str(root[i][j])+' is the root') if i<j: if root[i][root[i][j]-1]>0 : print('K'+str(root[i][root[i][j]-1])+' is the left child of K'+str(root[i][j])) Construct_Optimal_BST(root,i,root[i][j]-1,n,count) if root[root[i][j]+1][j]>0 : print('K'+str(root[root[i][j]+1][j])+' is the right child of K'+str(root[i][j])) Construct_Optimal_BST(root,root[i][j]+1,j,n,count) if i==j: print('d'+str(i-1)+' is the left child of K'+str(i)) print('d'+str(i)+' is the right child of K'+str(i)) if i>j: print('d'+str(j)+' is the right child of K'+str(j)) #test p=[0,0.15,0.1,0.05,0.1,0.2] q=[0.05,0.1,0.05,0.05,0.05,0.1] n=len(p)-1 Optimal_BST(p,q,n)