Exemplo n.º 1
0
Status CreateSOSTree(SOSTree &T, SSTable ST) {  // 算法9.4
  // 由有序表ST构造一棵次优查找树T。ST的数据元素含有权域weight
  float sw[20];
  if (ST.length == 0) T = NULL;
  else {
    FindSW(sw, ST); // 按照有序表ST中各元素的weight域求累计权值表sw
    SecondOptimal(T, ST.elem, sw, 1, ST.length);
  }
  return OK;
} // CreateSOSTree
Exemplo n.º 2
0
  /* 次优查找树T。算法9.3 */
	int i, j;
	double min, dw;
	i = low;
	min = fabs(sw[high] - sw[low]);
	dw = sw[high] + sw[low - 1];
	for (j = low + 1; j <= high; ++j) /* 选择最小的△Pi值 */
		if (fabs(dw - sw[j] - sw[j - 1]) < min)
		{
			i = j;
			min = fabs(dw - sw[j] - sw[j - 1]);
		}
	*T = (BiTree)malloc(sizeof(BiTNode));
	if (!*T)
		return ERROR;
	(*T)->data = R[i]; /* 生成结点 */
	if (i == low)
		(*T)->lchild = NULL; /* 左子树空 */
	else
		SecondOptimal(&(*T)->lchild, R, sw, low, i - 1); /* 构造左子树 */
	if (i == high)
		(*T)->rchild = NULL; /* 右子树空 */
	else
		SecondOptimal(&(*T)->rchild, R, sw, i + 1, high); /* 构造右子树 */
	return OK;
}

void FindSW(int sw[], SSTable ST)
{ /* 按照有序表ST中各数据元素的Weight域求累计权值表sw */
	int i;
	sw[0] = 0;
	for (i = 1; i <= ST.length; i++)
		sw[i] = sw[i - 1] + ST.elem[i].weight;
}

typedef BiTree SOSTree; /* 次优查找树采用二叉链表的存储结构 */
Status CreateSOSTree(SOSTree *T, SSTable ST)
{ /* 由有序表ST构造一棵次优查找树T。ST的数据元素含有权域weight。算法9.4 */
	if (ST.length == 0)
		*T = NULL;
	else
	{
		FindSW(sw, ST); /* 按照有序表ST中各数据元素的Weight域求累计权值表sw */
		SecondOptimal(T, ST.elem, sw, 1, ST.length);
	}
	return OK;
}