Data structures 最优二叉搜索树
我有一个关于最优二叉搜索树的作业,在做作业的过程中出现了一些问题。我在网上发现了很多有用的链接(只是通过谷歌搜索),但我想知道 为什么必须首先对键进行排序 如果在键未排序时获得较低的成本(用于最佳BST),这是否意味着我的代码中一定有错误 最佳BST必须完整/完美吗?(使用维基百科对完整和完美的定义) 一个完美的二叉树是一个完整的二叉树,其中所有的叶子都在相同的深度或水平。[1] (这也被模糊地称为完全二叉树。) 一个完整的二叉树是一个二叉树,在这个二叉树中,除了最后一个之外,所有的层次都被完全填充,所有的节点都尽可能的左移。[2] 对于最后一个问题,我假设最优树必须是完整的/完美的,但是一些在线小程序让我相信不是这样的。我无法解释为什么 为什么最初必须对键进行排序 他们没有。事实上,除非您使用的是自平衡树,否则最好以随机顺序将键添加到树中,因为树最终会更加平衡 如果在键未排序时获得较低的成本(用于最佳BST),这是否意味着我的代码中一定有错误 除非您正在编写自平衡树(您的自平衡算法不起作用) 最佳BST必须完整/完美吗 对。为了尽可能快地搜索给定的树,树的所有节点必须均匀分布;i、 e.树必须尽可能短。Data structures 最优二叉搜索树,data-structures,binary-search-tree,Data Structures,Binary Search Tree,我有一个关于最优二叉搜索树的作业,在做作业的过程中出现了一些问题。我在网上发现了很多有用的链接(只是通过谷歌搜索),但我想知道 为什么必须首先对键进行排序 如果在键未排序时获得较低的成本(用于最佳BST),这是否意味着我的代码中一定有错误 最佳BST必须完整/完美吗?(使用维基百科对完整和完美的定义) 一个完美的二叉树是一个完整的二叉树,其中所有的叶子都在相同的深度或水平。[1] (这也被模糊地称为完全二叉树。) 一个完整的二叉树是一个二叉树,在这个二叉树中,除了最后一个之外,所有的层次都被完全
void-optimizeBinSearchTree\u输出(浮点R[21][20],int i,int j,int r1,char*dir)
void OptimalBinsearchtree_output(float R[21][20],int i, int j, int r1, char *dir)
{
int t;
if (i <= j)
{
t =(int)R[i][j];
fprintf(wp,"%s is %s child of %s\n", name[t], dir, name[r1]);
OptimalBinsearchtree_output(R,i, t - 1, t, "left");
OptimalBinsearchtree_output(R,t + 1, j, t, "right");
}
}
void OptimalBinarySearchTree(int n, const float p[],float *minavg)
{
int i, j, k, diagonal,l,pos;
float R[21][20];
float min = 0;
float A[21][20],sum=0;
printf("\n");
for (i = 1; i <=n; i++)
{
A[i][i - 1] = 0;
R[i][i - 1] = 0;
A[i][i] = p[i];
R[i][i] = i;
fprintf(wp,"A[%d][%d]=%4f\tA[%d][%d]=%4f\t",i,i-1,A[i][i-1],i,i,A[i][i]);
fprintf(wp,"R[%d][%d]=%4f\tR[%d][%d]=%4f\n", i, i - 1, R[i][i - 1], i, i, R[i][i]);
}
A[n+1][n] = 0;
R[n+1][n] = 0;
for (diagonal = 1; diagonal <= n - 1; diagonal++)
{
for (i = 1; i <= n - diagonal; i++)
{
min = 0;
sum = 0;
j = i + diagonal;
for (l = i; l <=j; l++)
{
sum = sum + p[l];
}
A[i][j] = sum;
for (k = i; k <= j; k++)
{
sum = A[i][k - 1] + A[k + 1][j];
if (min == 0)
{
min = sum;
pos = k;
}
else if (sum<min)
{
min = sum;
pos = k;
}
}
A[i][j] += min;
R[i][j] = pos;
}
}
*minavg = A[1][n];
printf("\n");
for (i = 1; i <= n; i++)
{
for (j = 0; j <= n; j++)
{
printf("%0.3f ", R[i][j]);
}
printf("\n");
}
for (i = 1; i <= n; i++)
{
for (j = 0; j <= n; j++)
{
printf("%0.3f ", A[i][j]);
}
printf("\n");
}
fprintf(wp,"\n\n");
fprintf(wp,"%s is the root of the tree\n",name[(int)R[1][n]]);
int r1 = (int)R[1][n];
OptimalBinsearchtree_output(R,1, r1 - 1, r1, "left");
OptimalBinsearchtree_output(R,r1 + 1, n, r1, "right");
}
void removeall()
{
nodeptr node,temp;
node = head;
while (node->next != NULL)
{
temp = node;
node = node->next;
}
if (node == node->next)
{
node->next = NULL;
temp->next = NULL;
free(node);
return;
}
node->next = NULL;
temp->next = NULL;
free(node);
}
void print()
{
nodeptr curr = NULL, temp = NULL;
curr = head;
gl_index = 1;
while (curr != NULL)
{
curr->index = gl_index;
gl_p[gl_index] = curr->val;
strcpy(name[gl_index], curr->str);
gl_index++;
wp=fopen("Output.txt","w+");
fprintf(wp,"%s\t%f\t%d\n", curr->str, curr->val, curr->index);
curr = curr->next;
}
}
void generatenode()
{
int i, j;
nodeptr temp = NULL;
char a[20];
while (!feof(fp))
{
nodeptr curr = NULL, prev = NULL;
temp = (struct node*)malloc(sizeof(struct node));
fscanf(fp, "%s", &temp->str);
fgets(a, 20, fp);
temp->index = gl_index;
b = atof(a);
int flag = 0;
temp->val = b;
gl_p[gl_index] = temp->val;
gl_index++;
temp->next = NULL;
if (head == NULL)
{
head = temp;
curr = head;
}
else
{
curr = head;
while (!(strcmp(temp->str, curr->str) < 0))
{
if(curr->next==NULL)
{
curr->next = temp;
curr = curr->next;
temp->next = NULL;
flag = 0;
break;
}
else
{
flag = 1;
prev = curr;
curr = curr->next;
}
}
if (curr == head)
{
temp->next = curr;
head = temp;
}
else
{
if (flag == 1)
{
prev->next = temp;
temp->next = curr;
}
}
flag = 0;
}
}
}
{
int t;
如果(i str,curr->val,curr->index);
当前=当前->下一步;
}
}
void generatenode()
{
int i,j;
nodeptr temp=NULL;
chara[20];
而(!feof(fp))
{
nodeptr curr=NULL,prev=NULL;
temp=(结构节点*)malloc(sizeof(结构节点));
fscanf(fp、%s、&temp->str);
fgets(a,20,fp);
临时->索引=总帐索引;
b=atof(a);
int标志=0;
温度->值=b;
总账p[总账索引]=temp->val;
gl_索引++;
temp->next=NULL;
if(head==NULL)
{
压头=温度;
curr=头;
}
其他的
{
curr=头;
而(!(strcmp(temp->str,curr->str)<0))
{
如果(当前->下一步==NULL)
{
当前->下一步=温度;
当前=当前->下一步;
temp->next=NULL;
flag=0;
打破
}
其他的
{
flag=1;
上一次=当前;
当前=当前->下一步;
}
}
如果(当前==水头)
{
温度->下一步=当前;
压头=温度;
}
其他的
{
如果(标志==1)
{
上一个->下一个=温度;
温度->下一步=当前;
}
}
flag=0;
}
}
}
我没有使用自平衡树。这是否意味着最优树是非唯一的(假设唯一的键)还是树(前面提到的生成的w/排序键)不是最优的?非平衡二叉树按排序顺序插入键,不是最优的,因为键不会均匀分布。相反,您将得到一个链表,因为所有键都将插入树的一侧。好啊我理解你告诉我的一切,现在我已经指出了我的问题所在。虽然看起来大多数在线小程序实际上都没有生成最优树(),例如,使用2、9和11作为键应该会生成一个以11作为根的树,但我得到的是最优结果(9是根),我还不确定如何修复这个问题。除非我的逻辑有什么缺陷,别担心。右边的数字越大,左边的数字越小。