最优二叉搜索树

问题描述
二叉搜索树
二叉搜索树满足如下性质:假设
也就是说,二叉搜索树中的任意一个结点,它的左子树中的所有结点都不大于它,它的右子树中的所有结点都不小于它。
最优二叉搜索树
假设有
| 0 | 1 | 2 | 3 | |
|---|---|---|---|---|
| 10 | 20 | 30 | ||
上表给出了此问题的一个输入样例。
问题分析
如果优化二叉搜索树
关键字
其中,
因而,关键字
其中,
问题求解
首先各
接下来,计算相邻 2 个、3 个
算法代码
cpp
double Optimal_BST(double *p, double *q, int n)
{
// 初始化
double **c = new double *[n + 1];
double **w = new double *[n + 1];
for (int i = 0; i < n + 1; i++)
{
c[i] = new double[n + 1];
w[i] = new double[n + 1];
c[i][i] = 0;
w[i][i] = q[i];
}
// 计算
for (int x = 1; x < n + 1; x++) // x 表示计算相邻的 x+1 个子树
{
for (int i = 0; i < n - x; ++i)
{
int j = i + x;
c[i][j] = 65535; // 初始化为无穷大
w[i][j] = w[i][j - 1] + p[j] + q[j];
for (int k = i; k < j + 1; ++k) // 以 k 为根
{
double t = w[i][j];
if (k - 1 >= i) // 注意边界,下同
{
t += c[i][k - 1];
}
if (k + 1 <= j)
{
t += c[k + 1][j];
}
if (t < c[i][j]) // 保留最小值
{
c[i][j] = t;
}
}
}
}
double res = c[0][n];
// 释放堆空间
for (int i = 0; i < n + 1; i++)
{
delete c[i];
delete w[i];
}
delete c;
delete w;
return res;
}算法分析
- 时间复杂度:
- 空间复杂度: