扫码加入训练营

牢记核心词

学习得礼盒

计算机考研:数据结构常用算法精析(8)

2013-12-11 14:42:33来源:新东方在线编辑

  3.二叉排序树的删除结点

  (1)算法思路:设指针p指向待删除结点,q为p的父结点指针,分两种情况讨论如下:

  ①当p结点无左子树时,如图

  PR

  q

  P

  p=q->Lchild

  PR

  q

  P

  p=q->Rchild

  其中PR为p结点的右子树(PR=空时,P为叶结点)。此时删除操作只要令:

  q->Lchild=p->Rchild; 或 q->Rchild=p->Rchild;

  ②当p结点的左子树PL存在时,有两种删除方法。

  删除前:

  其一是 直接删除P,再将P的右子树接到新子树的最后下脚

  另一种:将P被最右下的元素替换而不用删除结点(用中序前驱替换)需要掌握的

  (2)算法描述

  Status BSTdelete(BSP t,keytype k)

  //在根指针为t的二叉排序树中,删除key=k的结点的算法//

  { BSP p,q,f,h;

  p=t;q=NULL; //q为p的父结点指针//

  while(p) //寻找被删除结点//

  { if(p->data.key==k)

  break; //找到被删p结点,退出//

  q=p;

  if(kdata.key)

  p=p->Lchild; //向左找//

  else

  p=p->Rchild; //向右找//

  }

  if(p==NULL)

  return(t); //若k不在树中,返回//

  if(p->Lchild==NULL) //p无左子树时//

  { if(q==NULL)

  t=p->Rchild; //p为根,删除后,其右子为根//

  else if(q->Lchild==p) //p为q之左子时//

  q->Lchild=p->Rchild;

  else

  q->Rchild=p->Rchild; //p为q之右子时//

  free(p);

  }

  else //p的左子树存在//

  { f=p;h=p->Lchild; //寻找p在中序下的直接前驱h//

  while(h->Rchild)

  { f=h;

  h=h->Rchild;

  }

  p->data=h->data; //以h结点代替p结点,即删除p结点//

  if(f!=p)

  f->Rchild=h->Lchild;

  else

  f->Lchild=h->Lchild;

  free(h);

  }

  return(t);

  }

考研公开课小程序

本文关键字: 计算机 考研 数据结构

考研英语核心词汇营

背词+听课+练习+督学,学习得礼盒

更多资料
更多>>
更多内容

关注新东方在线考研服务号

获得21考研真题及答案解析

1. 打开手机微信【扫一扫】,识别上方二维码;
2.点击【关注公众号】,获取资料大礼包。

考研资料大礼包
近10年考研真题及答案免费下载
更多>>
更多公开课>>
更多>>
更多资料