C++ 最优二叉搜索树

这是一篇关于C++实现最优二叉搜索树的技术博客,博主Slience分享了如何使用动态规划来构造最优化的二叉搜索树。文章强调自我提升的重要性,并鼓励读者面对挑战时保持乐观。
摘要由CSDN通过智能技术生成
//最优二叉查找树,利用动态规划实现
#include<iostream>
using namespace std;
void Optimal_BST(double *p,double *q,int length,double (*e)[20],int (*root)[20])
{
	int i,j,k,r;
	double t;
	double w[20][20]={0};
	for(i=1;i<=length+1;i++)
	{
		e[i][i-1]=q[i-1];
		w[i][i-1]=q[i-1];
	}
	//i为关键字之间的长度
	for(i=1;i<=length;i++)
	{
		//从下标为j开始的关键字到下标为k的关键字
		for(j=1;j<=length-i+1;j++)
		{
			k=i+j-1;
			e[j][k]=0x7fffffff;
			w[j][k]=w[j][k-1]+p[k]+q[k];
			//选取j到k之间的某个下标的关键字作为从j到k的根,如果组成的树的期望值当前最小,则r为从j
			//到k的根节点
			for(r=j;r<=k;r++)
			{
				t=e[j][r-1]+e[r+1][k]+w[j][k];
				if(e[j][k]>t)
				{
					e[j][k]=t;
					//r即为从下标j到k的根节点
					root[j][k]=r;
				}
			}
		}
	}

}
void Construct_Optimal_BST(int (*root)[20],int i,int j,bool flag)
{
	if(flag==0)
	{
		cout<<"k"<<root[i][j]<&l
最优二叉搜索树(Optimal Binary Search Tree)是一种动态规划的算法,用于在给定一组键和它们的概率时构建最优的二叉搜索树。 下面是 C 语言实现最优二叉搜索树的详细代码: ``` #include <stdio.h> #include <limits.h> #define MAX_KEYS 100 int keys[MAX_KEYS]; int freq[MAX_KEYS]; int n; int sum(int freq[], int i, int j) { int s = 0; for (int k = i; k <= j; k++) { s += freq[k]; } return s; } int opt_cost(int freq[], int i, int j) { if (j < i) { return 0; } if (j == i) { return freq[i]; } int fsum = sum(freq, i, j); int min_cost = INT_MAX; for (int r = i; r <= j; r++) { int cost = opt_cost(freq, i, r-1) + opt_cost(freq, r+1, j) + fsum; if (cost < min_cost) { min_cost = cost; } } return min_cost; } int main() { printf("Enter the number of keys: "); scanf("%d", &n); printf("Enter the keys:\n"); for (int i = 0; i < n; i++) { scanf("%d", &keys[i]); } printf("Enter the frequencies:\n"); for (int i = 0; i < n; i++) { scanf("%d", &freq[i]); } int cost = opt_cost(freq, 0, n-1); printf("Minimum cost of optimal BST is %d.\n", cost); return 0; } ``` 代码中,`sum()` 函数用于计算频率数组 `freq[]` 中下标从 `i` 到 `j` 的元素之和,`opt_cost()` 函数则是实现最优二叉搜索树的核心算法。`opt_cost()` 函数使用递归的方法,枚举所有可能的根节点,计算出每个根节点对应的最小成本,并返回其中的最小值。 在主函数中,输入了键和频率数组,并调用 `opt_cost()` 函数计算出最小成本。 需要注意的是,该代码仅仅是计算了最小成本,并没有构建出最优二叉搜索树的结构。如果需要构建出最优二叉搜索树,需要在递归过程中记录每个子树的根节点,然后根据这些根节点的位置来构建树的结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值