| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 448 人关注过本帖
标题:B-树结点的分裂 不是很理解 求指点
只看楼主 加入收藏
世界模型
Rank: 4
等 级:业余侠客
威 望:1
帖 子:240
专家分:226
注 册:2010-9-12
结帖率:97.44%
收藏
已结贴  问题点数:60 回复次数:1 
B-树结点的分裂 不是很理解 求指点
程序代码:
/* 将结点q分裂成两个结点,前一半保留,后一半移入新生结点ap */ 
void split(BTree *q,BTree *ap) 
{ 
    int i,s=(m+1)/2; s?

 
   *ap=(BTree)malloc(sizeof(BTNode));//生产新生结点ap  
    (*ap)->node[0].ptr=(*q)->node[s].ptr;//后一半移入ap  
 
  for(i=s+1;i<=m;i++)  i=s+1??????????????????
    {              
        (*ap)->node[i-s]=(*q)->node[i];  ?????????
       if((*ap)->node[i-s].ptr)  ????????
          (*ap)->node[i-s].ptr->parent=*ap; 
    } 
    (*ap)->keynum=m-s;  ??
    (*ap)->parent=(*q)->parent; 
    (*q)->keynum=s-1;//q的前一半保留 修改keynum  
}
/* 生成含信息(T,r,ap)的新的根结点*T 原T和ap为子树指针 */ 
void NewRoot(BTree *T,Record *r,BTree ap) 
{ 
    BTree p; 
   p=(BTree)malloc(sizeof(BTNode)); 
    p->node[0].ptr=*T; 
    *T=p; 
   if((*T)->node[0].ptr) 
        (*T)->node[0].ptr->parent=*T; 
    (*T)->parent=NULL;  ???????
    (*T)->keynum=1; 
   (*T)->node[1].key=r->key; ?????????
    (*T)->node[1].reptr=r;  ????????
    (*T)->node[1].ptr=ap; ????、、
   if((*T)->node[1].ptr) 
       (*T)->node[1].ptr->parent=*T;  ????????
}  

m表示阶数 i表示在结点中的序号
搜索更多相关主题的帖子: 分裂 
2011-08-14 21:20
QQ346957135
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:148
专家分:658
注 册:2011-8-9
收藏
得分:60 
程序代码:
#define m 3 //B_树的阶,现设为3
int s=(m+1)/2; //s为分裂结点的中值
void split(BTree q,BTree &ap)
{    //将结点*q分裂成两个结点,前一半保留在*q,后一半移入新生结点*ap
    int i;
    ap=(BTree)malloc(sizeof(BTNode)); // 生成新结点*ap
    ap->ptr[0]=q->ptr[s]; // 结点*q的后一半移入结点*ap
    if(ap->ptr[0]) // ap->ptr[0]不为空
        ap->ptr[0]->parent=ap; // 给ap->ptr[0]的双亲域赋值ap
    for(i=s+1;i<=m;i++) // 对于*q中后一半数据
    { 
        ap->key[i-s]=q->key[i]; // 3个成员均移结点*ap
        ap->recptr[i-s]=q->recptr[i];
        ap->ptr[i-s]=q->ptr[i];
        if(ap->ptr[i-s]) // ap->ptr[i-s]不为空
        ap->ptr[i-s]->parent=ap; // 给ap->ptr[i-s]的双亲域赋值ap
    }
    ap->keynum=m-s; // 新结点*ap的关键字个数
    q->keynum=s-1; // *q的前一半保留,修改*q的关键字个数
}
void NewRoot(BTree &T,Record* r,BTree ap)
{    //生成含信息(T,r,ap)的新的根结点*T,原根结点T和ap为其子树指针
    BTree p=(BTree)malloc(sizeof(BTNode)); // 动态生成新根结点
    p->parent=NULL; // 新根结点的双亲为空
    p->keynum=1; // 新根结点有1个关键字
    p->key[1]=r->key; // 这个关键字是记录r的关键字
    p->recptr[1]=r; // 指向记录r
    p->ptr[0]=T; // 原根结点T为新根结点的第1棵子树
    if(T) // 原根结点T不空
        T->parent=p; // 新根结点是原根结点T的双亲
    p->ptr[1]=ap; // 结点*ap为新根结点的第2棵子树
    if(ap) // ap不空
        ap->parent=p; // 新根结点是ap的双亲
    T=p; // T指向新根结点
}


[ 本帖最后由 QQ346957135 于 2011-8-15 20:59 编辑 ]

A real warrior never quits.
2011-08-15 20:56
快速回复:B-树结点的分裂 不是很理解 求指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016874 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved