设为首页 加入收藏

TOP

二叉查找树(十四)
2013-12-05 12:46:43 来源: 作者: 【 】 浏览:1302
Tags:查找

 

  中序遍历下,返回某一结点的后继结点

  1)如果结点x有右子结点,则其后继结点为右子树中最小结点。

  2)如果结点x没有右子树,且x有一个后继y,则y是x的最低祖先结点且y的左儿子也是x的祖先。

  TREE_SUCCESSOR(x)

  if right[x] != NIL

  return TREE_MINIMUM(right[x])

  y=p[x]

  while y!=NIL and x=right[y] //如果x=left[y],那么x的后继就是y,跳出while循环,直接返回y即可

  do x <-- y

  y <-- p[y]

  return y

  ============================================*/

  struct node * tree_successor(struct node *T)

  {

  if(T->right!=NULL)

  return tree_minimum(T->right);

  struct node *y=T->parent;

  while(y!=NULL && T == y->right){

  T=y;

  y=y->parent;

  }

  return y;

  }

  /*===========================================

  插入操作

  思路:从根节点一路往下寻找插入位置,用指针x跟踪这条寻找路径,并用指针y指向x的父结点

  TREE_INSERT(T,z)

  y=NIL

  x=root[T]

  while x!= NIL //直到x为空,这个空位置即为需要插入的位置

  do y<-- x

  if key[z]<key[x]

  then x <-- left[x]

  else x <-- right[x]

  p[z]=y

  if y=NIL

  then root[T]=z //树T为空时的情况

  else if key[z] < key[y]

  then left[y]=z //小于y的插在左边,大于的插在右边

  else right[y]=z

  ============================================*/

  void tree_insert(tree *PT,struct node *z)

  {

  if(*PT==NULL){//树为空,则将z作为根结点返回

  *PT=z;

  return;

  }

  struct node *y=NULL;

  struct node *x=*PT;

  while(x!=NULL){

  y=x;

  if(z->key < x->key)

  x=x->left;

  else

  x=x->right;

  }

  z->parent=y;

  if(z->key < y->key)

  y->left=z;

  else

  y->right=z;

  }

  /*===============================================

  删除操作

  删除操作分为三类情况:

  1)若要删除的节点z没有子女,则只需修改z的父节点的该子女为NIL即可

  2)若要删除的节点z只有一个子女,则只需将z的这个子女与z的父节点连接起来即可

  3)若要删除的节点z有两个子女,则需要先删除z的后继y,再用y的内容替换z的内容。

  TREE_DELETE(T,z)

  if left[z]=NIL || right[z]=NIL  //把要删除的节点先保存在y中

  then y <-- z

  else y <-- TREE_SUCCESSOR(z)

  if left[y]!=NIL                 //将y的非空子女存放在x中

  then X <-- left[y]

  else x <-- right[y]

  if x!=NIL

  then p[x]=p[y]    //将要删除节点的子女连接到要删除节点的父节点上

  if p[y]=NIL     //如果要删除的节点为根节点

  then root[T] <-- x

  else if y=left[p[y]]//

  then left[p[y]] <-- x

  else right[p[y]] <-- x

  if y!=z  //第三种情况,需要用y的内容替换z的内容

  then key[z] <-- key[y]

  copy y's other data to z

  return y

  ==============================================*/

  struct node * tree_delete(tree *PT,struct node *z)

  {

  struct node *delnode,*sonnode;

  if(z->left==NULL || z->right == NULL)//有一个子女或无子女,则要删除的结点结尾z本身

  delnode=z;

  else                                 //有两个子女,则要删除的结点为z的后继结点

  delnode=tree_successor(z);

  if(delnode->left!=NULL)

  sonnode=delnode->left;

  else

  sonnode=delnode->right;

  if(sonnode!=NULL)

  sonnode->parent=delnode->parent;

  if(delnode->parent==NULL)

  *PT=sonnode;

  else if(delnode->parent->left==delnode)

  delnode->parent->left=sonnode;

  else

  delnode->parent->right=sonnode;

  if(delnode!=z){

  z->key=delnode->key;

  strcpy(z->data,delnode->data);

  }

  return delnode;

  }

        

首页 上一页 11 12 13 14 15 下一页 尾页 14/15/15
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c语言连接mysql原代码实例 下一篇C语言随机函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: