原文来自猎豹网校
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *lchild;
struct Node *rchild;
}BiTreeNode,*BiTree;
BiTree BSTSearch(BiTree T,int x)
{
BiTreeNode *p;
if(T!=NULL)
{
p=T;
while(p!=NULL)
{
if(p->data==x)
return p;
else if(x<p->data)
p=p->lchild;
else if(x>p->data)
p=p->rchild;
}
}
return NULL;
}
int BSTInsert(BiTree *T,int x)
{
BiTreeNode *p,*cur,*parent=NULL;
cur=*T;
while(cur!=NULL)
{
if(cur->data==x)
return 0;//已存在关键字为x的节点
parent=cur;
if(x<cur->data)
cur=cur->lchild;
else
cur=cur->rchild;
}
p=(BiTreeNode *)malloc(sizeof(BiTreeNode));
if(!p)
exit(-1);
p->data=x;
p->lchild=NULL;
p->rchild=NULL;
if(!parent)
*T=p;
else if(x<parent->data)//如果关键字小于parent指向的节点,则新节点成为parent左孩子
parent->lchild=p;
else
parent->rchild=p;
return 1;
}
//删除结点操作
void DeleteNode(BiTree *s)
{
BiTree q,x,y;
if(!(*s)->rchild)
{
q=*s;
*s=(*s)->lchild;
free(q);
}
else if(!(*s)->lchild)
{
q=*s;
*s=(*s)->rchild;
free(q);
}
else//如果s左右子树都存在,则使s的直接前驱结点代替s,并使直接前驱结点的左子树成为成为双亲节点的右子树结点。
{
x=*s;
y=(*s)->lchild;
while(y->rchild!=NULL)//查找s的直接前驱结点y为s的直接前驱结点,x为y的双亲结点
{
x=y;
y=y->rchild;
}
(*s)->data=y->data;//结点s被y取代
if(x!=*s)
x->rchild=y->lchild;//使y的左子树成为x的右子树
else//如果s的左孩子结点不存在右子树
x->lchild=y->lchild;
free(y);
}
}
//删除特定结点操作
int BSTDelete(BiTree *T,int x)
{
if(!*T)
return 0;
else
{
if(x==(*T)->data)
DeleteNode(T);
else if((*T)->data>x)
BSTDelete(&(*T)->lchild,x);
else
BSTDelete(&(*T)->rchild,x);
}
}
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%4d",T->data);
InOrderTraverse(T->rchild);
}
}