删除二叉排序树中值为k的结点
用被删结点左子树最右下的结点的值代替被删结点的值,然后删去最右下的结点
#include "stdafx.h"
#include<iostream>
using namespace std;
typedef struct BSTreeNode
{
int data;
struct BSTreeNode *lchild,*rchild;
}BSTree;
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
void Delete(BSTree *bst,int x)
{
BSTree *f,*p=bst;
while(p&&p->data!=x)//查找值为x的结点
{
if(p->data>x)
{
f=p;p=p->lchild;
}
else
{
f=p;p->rchild;
}
}
if(p==NULL)exit(0);//没找到
if(p->lchild==NULL)//被删结点没有左子树,直接将右子树接到其双亲上
{
if(f->lchild==p)f->lchild=p->rchild;
else f->rchild=p->rchild;
}
else//被删结点有左子树
{
BSTree *q=p->lchild,*s=q;
while(q->rchild!=NULL)//查找左子树最右下的结点(中序最后结点)
{
s=q;q=q->rchild;
}
if(s==p->lchild)//p左子树的根结点无右子女
{
p->data=s->data;
p->lchild=s->lchild;
free(s);
}
else
{
p->data=q->data;
s->rchild=q->lchild;
free(q);//删除q结点
}
}
}
另一种方法:
用被删结点右子树最左下的结点的值代替被删结点的值,然后删去最左下的结点
void Delete(BSTree *bst,int x)
{
BSTree *f,*p=bst;
while(p&&p->data!=x)//查找值为x的结点
{
if(p->data>x)
{
f=p;p=p->lchild;
}
else
{
f=p;p->rchild;
}
}
if(p==NULL)exit(0);//没找到
if(p->rchild==NULL)//被删结点没有右子树,直接将左子树接到其双亲上
{
if(f->lchild==p)f->lchild=p->lchild;
else f->rchild=p->lchild;
}
else//被删结点有右子树
{
BSTree *q=p->rchild,*s=q;
while(q->lchild!=NULL)//查找右子树最左下的结点(中序最先结点)
{
s=q;q=q->lchild;
}
if(s==p->rchild)//p左子树的根结点无左子女
{
p->data=s->data;
p->rchild=s->rchild;
free(s);
}
else
{
p->data=q->data;
s->lchild=q->rchild;
free(q);//删除q结点
}
}
}