算法课件--第8节(查找表)11.ppt
文本预览下载声明
查找表:是一种以集合为逻辑结构,以查找为核心运 算,同时包括其他运算的数据结构。 North China Electric Power University ② 被删结点不是叶子,j无左,仅有右子树,则 s=j-rchild, s做p的左(或右)子树。 4 1 3 6 12 4 3 6 12 ③ 被删结点不是叶子,j有左,无右子树,则 s=j-lchild, s做p的左(或右)子树 p j s 4 3 2 6 12 4 2 6 12 p j s North China Electric Power University ④ j既有左,又有右。则沿j的左子树的右子树方向找, 一直找到按中序遍历j的直接前趋结点。此结点作为 新选的根结点s, 然后做相应的指针修改。 20 10 30 6 15 3 9 13 18 8 p j q s 20 9 30 6 15 3 8 13 18 在上图中,s-rchild=Null; s-lchild!=Null 修改四个指针:1)s-rchild=j-rchild; 2)q-rchild=s-lchild; 3)s-lchild=j-lchild; 4)p-lchild=s; North China Electric Power University 20 10 30 6 15 3 9 13 18 p j q s 20 9 30 6 15 3 13 18 在上图中,s-rchild=s-lchild=Null,仍做前面的四个操作。 20 9 30 6 15 3 13 18 p j,q s 20 6 30 3 15 13 18 上图中,s-rchild=Nill,且q=j,修改两个指针: 1)s-rchild=j-rchild; 2)p-lchild=s; North China Electric Power University 下面给出在二叉排序树T中查找结点j, 使j-key=x,如 果x在T中,则删除x结点,否则, 送出B=1,说明此树中 无被删结点的算法: void det(bitreptr t,bitreptr j, ElemType x) // j指向被删结点,p指向其双亲,假设树不空 { j=t; B=1; while((j!=NULL)(B==1)) { if (xj-key) { p=j; j=j-Lchild; } else if (x==j-key) B=0; else if (xj-key) { p=j; j=j-Rchild; } }//以上过程是查找过程 if(B==0) { if (j-Lchild==NULL) { s=j-Rchild; } while (s-Rchild==NULL) { q=s; s=s-Rchild; } if (q=j) { s-Rchild=j-Rchild; } if (j==p-Lchild) p-Lchild=s; else p-Rchild=s; if (j==p-Lchild) p-Lchild=s; else p-Rchild=s; if (j==p-Lchild) p-Lchild=s; else p-Rchild=s; if (j==p-Lchild) p-Lchild=s; else p-Rchild=s; else if (j-Rchild==NULL) { s=j-Lchild; } else { q=j; s=q-Lchild; else { s-Rchild=j-Rchild; q-Rchild=s-Lchild; s-Lchild=j-Lchild; } } North China Electric Power University if(B==0) { if (j-Lchild==NU
显示全部