一个可能的解题思路是使用动态规划。定义一个二维数组dp[i][j],表示从第i个关键字到第j个关键字构造的最优二叉查找树的平均搜索结点数。初始化dp数组为0。 然后使用两层循环,外层循环从小到大遍历关键字的范围,内层循环遍历可能的根节点。对于dp[i][j],假设根节点是k,则左子树范围是(i, k-1),右子树范围是(k+1, j)。计算dp[i][j]的方法如下: 1. 对于关键字ki到kj之间的实际关键字,累加它们的概率,得到sum_p = sum(pi + pi+1 + ... + pj)。 2. 对于虚拟键di到dj之间的虚拟键,累加它们的概率,得到sum_q = sum(qi + qi+1 + ... + qj)。 3. 对于根节点k,搜索到的结点总数为sum_p + sum_q,左子树的结点总数为dp[i][k-1],右子树的结点总数为dp[k+1][j],因此dp[i][j] = sum_p + sum_q + dp[i][k-1] + dp[k+1][j]。 4. 这里需要注意的是,如果左子树或右子树为空,即k-1 < i或k+1 > j,那么dp[i][k-1]或dp[k+1][j]应该为0。 最终的答案为dp[1][n],即从第1个关键字到第n个关键字构造的最优二叉查找树的平均搜索结点数。 [2024-06-07 16:14:48 | AI写代码神器 | 584点数解答]