#include <iostream>
using namespace std;
typedef struct BSTNode
{
int key;
struct BSTNode *lchild,*rchild;
}BSTNode,*BSTree;
//二叉排序树的插入——递归实现
void InsertBST(BSTree &DT,BSTNode *p)
{
if(DT==NULL)
DT=p;
else if((DT->key) > (p->key))
InsertBST(DT->lchild,p);
else
InsertBST(DT->rchild,p);
}
//二叉排序树结点的删除
void DeleteBST(BSTree &DT,BSTNode *p)
{//要删除结点p,f是p的双亲
BSTNode *f;
BSTNode *q,*fq;
if(!(p->lchild)&&!(p->rchild))//第一种情况:p是叶子结点
{
if(f->lchild==p)//p是左孩子
f->lchild=NULL;
else//p是右孩子
f->rchild=NULL;
q=p;
}
else if(!(p->rchild))//第二种情况:(1)p只有左子树
{
if(f->lchild==p)
f->lchild=p->lchild;
else
f->rchild=p->lchild;
q=p;
}
else if(!(p->lchild))//第二种情况:(2)p只有右子树
{
if(f->lchild==p)
f->lchild=p->rchild;
else
f->rchild=p->rchild;
q=p;
}
else //第三种情况:p既有左子树又有右子树
{//用p的中序后继来代替p
fq=p;//fq是q的双亲
q=p->lchild;
while(q->lchild)
{//遍历找到p的中序后继
fq=q;
q=q->lchild;
}
p->key=q->key;
if(fq==p)
fq->rchild=q->rchild;
else
fq->lchild=q->rchild;
}
delete q;
}
//二叉排序树的构造
void CreateBST(BSTree &DT,int n)
{
int i,j;
int r[100];
BSTNode *s;
DT=NULL;//这里一定要将DT置空,表示刚开始的时候是空树,不置空的话,编译器分配的DT是非空的
for(j=0;j<n;j++)
cin>>r[j];
for(i=0;i<n;i++)
{
s=new BSTNode;
s->key=r[i];
s->lchild=NULL;
s->rchild=NULL;
InsertBST(DT,s);
}
}
//二叉排序树的搜索——递归实现
BSTNode * SearchBST(BSTree &DT,int k)
{
BSTNode *p;
p=DT;
if(DT==NULL)
return NULL;
else if(p->key==k)
return p;
else if(p->key>k)
return SearchBST(p->lchild,k);
else
return SearchBST(p->rchild,k);
}
void main()
{
freopen("in.txt","r",stdin);
BSTree DT;
BSTNode *p;
int k;
CreateBST(DT,13);
cin>>k;
p=SearchBST(DT,k);
cout<<p->key<<endl;
//DeleteBST(DT,p);
}
这个二叉排序树不难,可是我有一个地方不太明白,就是二叉排序树结点的删除,首先删除某个结点,一定要知道结点的位置吧,也就是要查找表才能确定你所删除元素的位置,其次结点的删除需要用到被删除结点的双亲,要说那个结点吧,查找一下就能找到那个结点的位置,可是要找它的双亲,就比较困难了啊,难道还得修改查找的算法,让它也能找到某个结点的双亲?总之这个程序还不是很完美,我还得继续改进这个程序!