首页 > 代码库 > 最优二叉搜索树
最优二叉搜索树
OBST问题的解法是动态规划,用到了3层循环,
第一层循环变量是子树的节点个数 l
第二层循环的变量是子树的起点位置i,i即是子树的左边界,j是子树的右边界
第三层循环的变量是子树的根节点位置r
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #define INF 9999; 5 6 void Optimal_BST(double p[],int n){ 7 int i,j,l,r; 8 int root[n+1][n+1]; 9 double e[n+2][n+2];10 double w[n+2][n+2];11 for(i=1;i<=n+1;i++){12 e[i][i-1]=0;13 w[i][i-1]=0;14 }15 16 for(l=1;l<=n;l++){17 for(i=1; i<=n-l+1; i++){ // i,j between 1 and n+1,i是左边界,j是右边界 18 j=i+l-1;19 e[i][j]=INF;20 w[i][j]=w[i][j-1]+p[j]; 21 for(r=i;r<=j;r++){22 double temp=e[i][r-1]+e[r+1][j]+w[i][j];23 if(temp<e[i][j]){24 e[i][j]=temp;25 root[i][j]=r;26 }27 }28 }29 }30 printf("\n\ne table\n"); 31 for(i=1;i<=n;i++){32 for(j=1;j<=n;j++){33 if(i>j)printf(" ");34 else printf("%f ",e[i][j]);35 }36 printf("\n");37 }38 39 printf("\n\nw table\n");40 for(i=1;i<=n;i++){41 for(j=1;j<=n;j++){42 if(i>j)printf(" ");43 else printf("%f ",w[i][j]);44 }45 printf("\n");46 }47 48 printf("\n\nroot table\n");49 for(i=1;i<=n;i++){50 for(j=1;j<=n;j++){51 if(i>j)printf(" ");52 else printf("%d ",root[i][j]);53 }54 printf("\n");55 }56 }57 58 int main(){59 int n=5;60 double p[6]={-1,0.25,0.2,0.05,0.2,0.3};61 Optimal_BST(p,n);62 return 0;63 }
最优二叉搜索树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。