77范文网 - 专业文章范例文档资料分享平台

《数据结构题集》答案 第9章 查找(2)

来源:网络收集 时间:2019-01-03 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

{

p=T->rchild;

q=(BiThrNode*)malloc(sizeof(BiThrNode)); q->data=x;

T->rchild=q;T->rtag=0;

q->rtag=1;q->rchild=p; //修改原线索 }

else BSTree_Insert_Key(T->rchild,x);//T有右子树时,插入右子树中 }//if

else if(T->data>x) //插入到左子树中 {

if(!T->lchild) //T没有左子树时,作为左孩子插入 {

q=(BiThrNode*)malloc(sizeof(BiThrNode)); q->data=x; T->lchild=q;

q->rtag=1;q->rchild=T; //修改自身的线索 }

else BSTree_Insert_Key(T->lchild,x);//T有左子树时,插入左子树中 }//if

}//BSTree_Insert_Key 9.37

Status BSTree_Delete_key(BiThrTree &T,int x)//在后继线索二叉排序树T中删除元素x {

BTNode *pre,*ptr,*suc;//ptr为x所在结点,pre和suc分别指向ptr的前驱和后继 p=T;last=NULL; //last始终指向当前结点p的前一个(前驱) while(!p->ltag) p=p->lchild; //找到中序起始元素 while(p) {

if(p->data==x) //找到了元素x结点 {

pre=last; ptr=p; }

else if(last&&last->data==x) suc=p; //找到了x的后继 if(p->rtag) p=p->rtag; else {

p=p->rchild;

while(!p->ltag) p=p->lchild; } //转到中序后继 last=p;

}//while //借助中序遍历找到元素x及其前驱和后继结点 if(!ptr) return ERROR; //未找到待删结点 Delete_BSTree(ptr); //删除x结点 if(pre&&pre->rtag)

pre->rchild=suc; //修改线索 return OK;

}//BSTree_Delete_key

void Delete_BSTree(BiThrTree &T)//课本上给出的删除二叉排序树的子树T的算法,按照线索二叉树的结构作了一些改动 { q=T;

if(!T->ltag&&T->rtag) //结点无右子树,此时只需重接其左子树 T=T->lchild;

else if(T->ltag&&!T->rtag) //结点无左子树,此时只需重接其右子树 T=T->rchild;

else if(!T->ltag&&!T->rtag) //结点既有左子树又有右子树 {

p=T;r=T->lchild; while(!r->rtag) { s=r;

r=r->rchild; //找到结点的前驱r和r的双亲s }

T->data=r->data; //用r代替T结点 if(s!=T)

s->rchild=r->lchild;

else s->lchild=r->lchild; //重接r的左子树到其双亲结点上 q=r; }//else

free(q); //删除结点 }//Delete_BSTree

分析:本算法采用了先求出x结点的前驱和后继,再删除x结点的办法,这样修改线索时会比较简单,直接让前驱的线索指向后继就行了.如果试图在删除x结点的同时修改线索,则问题反而复杂化了. 9.38

void BSTree_Merge(BiTree &T,BiTree &S)//把二叉排序树S合并到T中 {

if(S->lchild) BSTree_Merge(T,S->lchild);

if(S->rchild) BSTree_Merge(T,S->rchild); //合并子树 Insert_Key(T,S); //插入元素 }//BSTree_Merge

void Insert_Node(Bitree &T,BTNode *S)//把树结点S插入到T的合适位置上 {

if(S->data>T->data) {

if(!T->rchild) T->rchild=S; else Insert_Node(T->rchild,S); }

else if(S->datadata) {

if(!T->lchild) T->lchild=S; else Insert_Node(T->lchild,S); }

S->lchild=NULL; //插入的新结点必须和原来的左右子树断绝关系 S->rchild=NULL; //否则会导致树结构的混乱 }//Insert_Node

分析:这是一个与课本上不同的插入算法.在合并过程中,并不释放或新建任何结点,而是采取修改指针的方式来完成合并.这样,就必须按照后序序列把一棵树中的元素逐个连接到另一棵树上,否则将会导致树的结构的混乱. 9.39

void BSTree_Split(BiTree &T,BiTree &A,BiTree &B,int x)//把二叉排序树T分裂为两棵二叉排序树A和B,其中A的元素全部小于等于x,B的元素全部大于x {

if(T->lchild) BSTree_Split(T->lchild,A,B,x);

if(T->rchild) BSTree_Split(T->rchild,A,B,x); //分裂左右子树 if(T->data<=x) Insert_Node(A,T);

else Insert_Node(B,T); //将元素结点插入合适的树中 }//BSTree_Split

void Insert_Node(Bitree &T,BTNode *S)//把树结点S插入到T的合适位置上 {

if(!T) T=S; //考虑到刚开始分裂时树A和树B为空的情况 else if(S->data>T->data) //其余部分与上一题同 {

if(!T->rchild) T->rchild=S; else Insert_Node(T->rchild,S); }

else if(S->datadata) {

if(!T->lchild) T->lchild=S; else Insert_Node(T->lchild,S); }

S->lchild=NULL;

S->rchild=NULL; }//Insert_Key 9.40

typedef struct {

int data; int bf;

int lsize; //lsize域表示该结点的左子树的结点总数加1 BlcNode *lchild,*rchild;

} BlcNode,*BlcTree; //含lsize域的平衡二叉排序树类型

BTNode *Locate_BlcTree(BlcTree T,int k)//在含lsize域的平衡二叉排序树T中确定第k小的结点指针 {

if(!T) return NULL; //k小于1或大于树结点总数 if(T->lsize==k) return T; //就是这个结点 else if(T->lsize>k)

return Locate_BlcTree(T->lchild,k); //在左子树中寻找

else return Locate_BlcTree(T->rchild,k-T->lsize); //在右子树中寻找,注意要修改k的值

}//Locate_BlcTree 9.41

typedef struct {

enum {LEAF,BRANCH} tag; //结点类型标识 int keynum;

BPLink parent; //双亲指针 int key[MAXCHILD]; //关键字 union {

BPLink child[MAXCHILD];//非叶结点的孩子指针 struct {

rectype *info[MAXCHILD];//叶子结点的信息指针 BPNode *next; //指向下一个叶子结点的链接 } leaf; }

} BPNode,*BPLink,*BPTree;//B+树及其结点类型 Status BPTree_Search(BPTree T,int key,BPNode *ptr,int pos)//B+树中按关键字随机查找的算法,返回包含关键字的叶子结点的指针ptr以及关键字在叶子结点中的位置pos { p=T;

while(p.tag==BRANCH) //沿分支向下查找

{

for(i=0;ikeynum&&key>p->key[i];i++); //确定关键字所在子树 if(i==p->keynum) return ERROR; //关键字太大 p=p->child[i]; }

for(i=0;ikeynum&&key!=p->key[i];i++); //在叶子结点中查找 if(i==p->keynum) return ERROR; //找不到关键字 ptr=p;pos=i; return OK;

}//BPTree_Search 9.42

void TrieTree_Insert_Key(TrieTree &T,StringType key)//在Trie树T中插入字符串key,StringType的结构见第四章 {

q=(TrieNode*)malloc(sizeof(TrieNode)); q->kind=LEAF;

q->lf.k=key; //建叶子结点 klen=key[0]; p=T;i=1;

while(p&&i<=klen&&p->bh.ptr[ord(key[i])]) {

last=p;

p=p->bh.ptr[ord(key[i])]; i++;

} //自上而下查找

if(p->kind==BRANCH) //如果最后落到分支结点(无同义词): {

p->bh.ptr[ord(key[i])]=q; //直接连上叶子 p->bh.num++; }

else //如果最后落到叶子结点(有同义词): {

r=(TrieNode*)malloc(sizeof(TrieNode)); //建立新的分支结点

last->bh.ptr[ord(key[i-1])]=r; //用新分支结点取代老叶子结点和上一层的联系 r->kind=BRANCH;r->bh.num=2; r->bh.ptr[ord(key[i])]=q;

r->bh.ptr[ord(p->lf.k[i])]=p; //新分支结点与新老两个叶子结点相连 }

}//TrieTree_Insert_Key

分析:当自上而下的查找结束时,存在两种情况.一种情况,树中没有待插入关键字的同义词,此时只要新建一个叶子结点并连到分支结点上即可.另一种情况,有同

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库《数据结构题集》答案 第9章 查找(2)在线全文阅读。

《数据结构题集》答案 第9章 查找(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/403583.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: