最优二叉搜索树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define max 9999
void OptimalBST(int,float*,float**,int**);
void OptimalBSTPrint(int,int,int**);
void main()
{
int i,num;
FILE *point;
//所有数据均从2.txt中获取,2.txt中第一个数据表示节点个数;从第二个数据开始表示各个节点的概率
point=fopen("2.txt","r");
if(point==NULL)
{
printf("cannot open 2.txt.\n");
exit(-1);
}
fscanf(point,"%d",&num);
printf("%d\n",num);
float *p=(float*)malloc(sizeof(float)*(num+1));
for(i=1;i fscanf(point,"%f",&p[i]); //创建主表; float **c=(float**)malloc(sizeof(float*)*(num+2)); for(i=0;i c[i]=(float*)malloc(sizeof(float)*(num+1)); //创建根表; int **r=(int**)malloc(sizeof(int*)*(num+2)); for(i=0;i r[i]=(int*)malloc(sizeof(int)*(num+1)); //动态规划实现最优二叉查找树的期望代价求解。。 OptimalBST(num,p,c,r); printf("该最优二叉查找树的期望代价为:%f \n",c[1][num]); //给出最优二叉查找树的中序遍历结果; printf("构造成的最优二叉查找树的中序遍历结果为:"); OptimalBSTPrint(1,4,r); } void OptimalBST(int num,float*p,float**c,int**r) { int d,i,j,k,s,kmin; float temp,sum; for(i=1;i { c[i][i-1]=0; c[i][i]=p[i]; r[i][i]=i; } c[num+1][num]=0; for(d=1;d<=num-1;d++)//加入节点序列 { for(i=1;i<=num-d;i++) { j=i+d; temp=max; for(k=i;k<=j;k++)//找最优根 { if(c[i][k-1]+c[k+1][j] { temp=c[i][k-1]+c[k+1][j]; kmin=k; } } r[i][j]=kmin;//记录最优根 sum=p[i]; for(s=i+1;s<=j;s++) sum+=p[s]; c[i][j]=temp+sum; } } } //采用递归方式实现最优根的输出,最优根都是保存在r[i][j]中的。。。void OptimalBSTPrint(int first,int last,int**r) { int k; if(first<=last) { k=r[first][last]; printf("%d ",k); OptimalBSTPrint(first,k-1,r); OptimalBSTPrint(k+1,last,r); } }