二叉排序树的删除

对于二叉排序树来说,其中难点就是删除,因为要保持树的顺序,就不能破坏树的构造,所以比较的麻烦,今天我搞了好长时间才将问题给改完,问题不大,但是很难看出来!

对于二叉排序树来说,删除节点有几种情况,我认为有4种,首先最容易想到的也是最简单的,就是叶子节点的删除,大家可以知道,叶子节点的删除只需要将叶子移除就行啦,我刚开始是用delete的方法,认为将节点删除就行啦,但是令我下午最头疼的就是,怎么会将节点删除了,但是数据变为了0,这个让我十分的郁闷,但是我也一直没有找到哪里是错的,然后就将叶子节点放下,想想其他三种情况,就是右子树为空,左子树为空,左右子树都不为空。就搞最复杂的,这个谁知道也是那个问题,到最后我才发现是因为赋NULL值的时候出现的问题!

说下左右子树都有 时删除时的方法,删除这种节点,我采用的是将这个节点的前驱放在这个节点的位置,删除前驱,通俗的说法就是,将比这个节点的值小的中找出最大的放在它的位置上!不懂的看下代码。代码可能不好,但是有帮助就行。


main.cpp:
#include <iostream>
using namespace std;
#include "han.h"


int main()
{
BSTree T,s;
s = new BSTNode;
createTree(T);
cout<<"以中序遍历输出"<<endl;
coutTree(T);
cout<<endl;
int e;
cout<<"输入要查找的数据"<<endl;
cin>>e;
s = selectTree(T,e);
if(s)
cout<<s->data<<endl;
cout<<"输入删除的数据"<<endl;
cin>>e;
deleteTree(T,e);
cout<<"以中序遍历输出"<<endl;
coutTree(T);
cout<<endl;
return 0;
}


han.h:

#include <iostream>
#include <stdlib.h>
using namespace std;


typedef struct BSTNode 
{
int data;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;


int InsertBST(BSTree &T,int e)
{
if(T == NULL)
{
T = new BSTNode;
T->data = e;
T->lchild = T->rchild = NULL;
return 1;
}
else if(e < T->data)
{
return InsertBST(T->lchild,e);
}
else if(e > T->data)
{
return InsertBST(T->rchild,e);
}

}


void createTree(BSTree &T)
{
T = NULL;
int e;
cout<<"输入要创建的数据项"<<endl;
cin>>e;
while(e != 0)
{
int a = InsertBST(T,e);
cin>>e;
}
}


void coutTree(BSTree T)
{
if(T == NULL)
{
return ;
}
else
{
coutTree(T->lchild);
cout<<T->data<<" ";
coutTree(T->rchild);
}
}


BSTree selectTree(BSTree T,int e)
{
if(!T)
{
cout<<"没有这个数据"<<endl;
return T;
}
else if(e == T->data)
return T;
else if(e<T->data)
{
return selectTree(T->lchild,e);
}
else 
return selectTree(T->rchild,e);

}

void deleteTree(BSTree &T,int e)
{
BSTree p,q,f;
p = T;
while(p)
{
if(p->data == e)
break;
q = p;
if(p->data > e)
p = p->lchild;
else if(p->data < e)
p = p -> rchild;
}
if(p == NULL)
{
return ;
}
if(p->lchild == NULL&&p->rchild!=NULL)
{
q->rchild = p ->rchild;
delete p;
}
if(p->rchild == NULL&&p->lchild!=NULL)
{
q->lchild = p->lchild;
delete p;
}
if(p->rchild!=NULL&&p->lchild!=NULL)
{
f = p->lchild;
while(f->rchild != NULL)
{
q = f;
f = f->rchild;
}
p->data = f->data;
if(f -> lchild != NULL)
q->rchild = f->lchild;
else
q->rchild = NULL;
delete f;

}
if(p->rchild == NULL&&p->lchild == NULL)
{
if(q->rchild&&q->rchild->data == p->data)
{
q->rchild = NULL;
}
else if(q->lchild&&q->lchild->data == p->data)
{
q->lchild = p->lchild;
}
delete p;

}
}

运行结果:

输入要创建的数据项
62 88 58 47 35 73 51 99 37 93
0
以中序遍历输出
35 37 47 51 58 62 73 88 93 99 
输入要查找的数据
62
62
输入删除的数据
47
以中序遍历输出
35 37 51 58 62 73 88 93 99 


数据结构的查找中有很多难点,有二叉平衡树,B树等,二叉排序树是最简单的,希望一定搞明白。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值