二叉排序树
二叉排序树(Binary sort tree),又称为二叉查找树.它或者是一颗空树,或者是具有下列性质的二叉树.
- 若它的左子树不为空,则左子树上的所有节点的值均小于它的根节点.
- 若它的右子树不为空,则右子树上的所有节点的值均大于它的根节点.
- 它的左右子树也分别为二叉排序树
代码
/**
2018-11-26 16:54:26
二叉排序树
**/
#include <stdio.h>
#define TRUE 1
#define FALSE 0
typedef struct BTNode
{
int data;
struct BTNode *lchild ,*rchild;
}BTNode,*BiTree;
int insertBST(BiTree *T,int key);
//访问结点并输出
void visit(BiTree bt)
{
if (bt->data != NULL)
{
printf("%3d", bt->data);
}
}
//中序遍历
void InNode(BiTree bt)
{
if (bt != NULL)
{
InNode(bt->lchild);
visit(bt);
InNode(bt->rchild);
}
}
/**
T : 要查询的二叉排序树
key : 要查找的值
f : 指向T的双亲,初始值为NULL
p : 如果查找成功返回指向该元素的节点,否则p为指向查找路径上访问的最后一个节点.
**/
int SearchBST(BiTree T, int key,BiTree f, BiTree *p)
{
if( !T ) //查找不成功
{
*p = f; //p指向访问的最后一个节点.
return FALSE;
}
else if(key == T->data){
*p = T;
return TRUE;
}else if(key > T->data){
return SearchBST(T->rchild,key,T,p);
}else
return SearchBST(T->lchild,key,T,p);
}
//二叉排序树插入操作.
int insertBST(BiTree *T,int key)
{
BiTree p,s;
if( !SearchBST(*T,key,NULL,&p) ){ //查找不成功(False为 1),这个时候p指向了最后一个节点.
s =(BiTree) malloc(sizeof(BTNode)); //说明不存在,插入一个节点.
s->data =key;
s->lchild=s->rchild=NULL;
if(!p) //p为空,说明这个时候没有二叉排序树.
*T = s; //s为根节点
else if (key < p->data)
p->lchild = s;
else
p->rchild = s;
return TRUE;
}
return FALSE;
}
int Delete(BiTree *p)
{
BiTree q,s;
if( (*p)->rchild==NULL ) //右子树空则只需要重接它的左子树
{
q =*p;
*p =(*p)->lchild;
free(q);
}
else if((*p)->lchild==NULL ) //左子树为空,同样的操作
{
q =*p;
*p =(*p)->rchild;
free(q);
}
else //左右子树都不为空
{
q =*p; s=(*p)->lchild;;
while(s->rchild)
{
q=s;s=s->rchild;
}
(*p)->data=s->data; //s指向被删除节点的直接前驱
//s的值是被删除节点的左子树下的最大值.
if(q!=*p) //说明被删除节点的左子树存在右子树
q->rchild =s->lchild;
else
q->lchild=s->lchild;
free(s);
}
return TRUE;
}
//二叉排序树的删除
int deleteBST(BiTree *T,int key)
{
BiTree p;
if( !SearchBST(*T,key,NULL,&p) ){ //查找不成功,不存在关键字
return FALSE;
}
else
Delete(&p); //如果查找成功,p指向该元素节点.
}
int main()
{
int i;
BiTree T=NULL,p;
int a[10]={12,23,35,48,49,55,78,85,89,93};
for(i=0;i<10;i++)
{
insertBST(&T,a[i]);
}
InNode(T);
printf("\n");
insertBST(&T,51);
InNode(T);
printf("\n");
deleteBST(&T,55);
InNode(T);
return 0;
}