1、基本概念:
(1)若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
(2)若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
(3 它的左、右子树也分别为二叉排序树
2、示例:
3、动态规划函数:
5、矩阵C和矩阵R:
6、算法:
double C[1000][1000];
double R[1000][1000];
double OptimalBST(double p[], int n) {
int i, j, k, d;
int min, mink, sum;
for (i = 1; i <= n; i++) { //初始化主对角线和第一条次对角线
C[i][i - 1] = 0;
C[i][i] = p[i - 1]; //第i个元素的查找概率存储在p[i-1]处
R[i][i] = i;
}
C[n + 1][n] = 0;
for (d = 1; d < n; d++) { //按对角线逐条计算
for (i = 1; i <= n - d; i++) {
j = i + d;
min = 1000;
mink = i;
sum = 0;
for (k = 1; k <= j; k++) {
sum = sum + p[k - 1]; //下标从0开始
if (C[i][k - 1] + C[k + 1][j] < min) { //接之前的for循环,求所有k中最小的min
min = C[i][k - 1] + C[k + 1][j];
mink = k; //记录k值
}
}
C[i][j] = min + sum;
R[i][j] = mink;
}
return C[1][n];
}
}