对于二叉排序树来说,其中难点就是删除,因为要保持树的顺序,就不能破坏树的构造,所以比较的麻烦,今天我搞了好长时间才将问题给改完,问题不大,但是很难看出来!
对于二叉排序树来说,删除节点有几种情况,我认为有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树等,二叉排序树是最简单的,希望一定搞明白。