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
/* 次优查找树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; }