#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#include<algorithm>
#define keytype int
using namespace std;
keytype Key[20]={4,5,6,7};//包含了n个键
float p[20]={3/8,3/8,1/8,1/8};//查找到每个键的概率
int R[20][20];//每一步为根节点选择的索引
float A[20][20];//平均查找时间
struct nodetype{
keytype key;
nodetype* left;
nodetype* right;
};
typedef nodetype* node_pointer;
//算法3.8查找二叉树
void binsearchtree(node_pointer tree,keytype keyin,node_pointer &p)
{
bool found=false;
p=tree;
while(!found)
{
if(p->key==keyin)
{
found=true;
}
else if(keyin < p->key)
p=p->left;
else
p=p->right;
}
}
//算法3.9最优二叉查找树
void optsearchtree(int n,const float p[],float& minavg)//p为搜索每个点的概率
{
for(int i=0;i<n;i++)
{
A[i][i]=0;
A[i][i+1]=p[i];
R[i][i]=0;
R[i][i+1]=i;
}
float sump=0;
for(int i=0;i<n;i++)
sump+=p[i];
for(int diagonal=1;diagonal<n;diagonal++)
{
for(int i=1;i<=n-diagonal;i++)
{
int j=i+diagonal;
A[i][j]=A[i][i-1]+A[i+1][j]+sump;
R[i][j]=i;
for(int k=i+1;k<=j-1;k++)
{
float temp=A[i][k-1]+A[k+1][j];
if(temp<A[i][j])
{
A[i][j]=temp+sump;
R[i][j]=k;
}
}
}
}
minavg=A[0][n-1];
}
//算法3.10生成最优二叉查找树
node_pointer BuildOptTree(int i,int j)
{
int k;
node_pointer p;
k=R[i][j];
if(k==0)
return NULL;
else{
p->key=Key[k];
p->left=BuildOptTree(i,k-1);
p->right=BuildOptTree(k+1,j);
return p;
}
}
int main()
{
memset(R,0,sizeof(int));
memset(A,0,sizeof(float));
int n=5;
float minavg;
optsearchtree(n,p,minavg);
node_pointer np=BuildOptTree(0,n-1);
cout<<minavg<<endl;
cout<<R[0][n-1]<<endl;
cout<<np->key<<endl;
return 0;
}
ps:程序有些bug,还没调处来。