算法思想:动态规划
实际问题:最优二叉搜索树
编写语言:Java
问题描述
二叉搜索树的定义:
满足以下任意两个条件的一个,就可称这棵树为二叉搜索树:
它是一棵空树
该树是一颗二叉树,非空,且满足下列两个条件:
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
即当该二叉树非空时,使用中序遍历可以得到一个递增的有序序列
值得注意的是:
二叉搜索树的左右子树也是二叉搜索树,我们因此可以使用递归手段来构造二叉搜索树
一个有序序列的二叉搜索树不只一棵,这就为我们寻找最优二叉搜索树提供了可能
最优二叉搜索树指的是在一个序列的所有二叉搜索树中花费代价最小的那棵。
递归结构
用C[i , j]表示从 i 到 j 的最优二叉查找树的代价,假设有n个顶点,那么我们的目标是要求C[1 , n]从 i 到 j 的一个最优二叉查找树是怎么得到的?它是从 i 到 j 之间的顶点中选出一个顶点来做root,假设选出的这个做root的顶点是 k (i <= k <= j), 那么显然有:
C[i , j] = min(C[i, k - 1] + C[k + 1, j]) + Sum(pi, pj),其中:1 <= i <= j <= n,i <= k <= j,pi表示遍历第i个结点的代价&#x