Status SecondOptimal(BiTree *T, ElemType R[], int sw[], int low, int high) { /* 由有序表R[low..high]及其累计权值表sw(其中sw[0]==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; }
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; }
//当有序表中各记录的查找概率不相等时,应使用静态最优查找树。 //但构造静态最优查找树花费的时间代价较高,所以用次优查找树来代替。 //次优查找树 void SecondOptimal(BiTree &T,ElemType R[],float sw[],int low,int high) { i=low; min=abs(sw[high]-sw[low]); dw=sw[high]+sw[low-1]; for(j=low+1;j<=high;++j) { if(abs(dw-sw[j]-sw[j-1])<min) { i=j; min=abs(dw-sw[j]-sw[j-1]); } } T=(BiTree)malloc(sizeof(BiTNode)); 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); }