roseying 2020-05-11
二叉排序树
插入,删除和查找的效率都比较高(创建时与二叉树相同)
二叉排序树又称为二叉排序树,若不为空树,则有以下性质:
查找:二叉树的中序遍历(从小到大)
插入:比根节点小的插入到二叉树根节点的左边,反之插入到右边
删除:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild;//左孩子
struct BiTNode *rchild;//右孩子
}BiTNode,* BiTree;
int Delete(BiTree *);
//递归查找二叉树T中是否存在key
//指针f指向T的双亲,其初始值调用值为NULL
//若查找成功,则指针p指向该数据元素结点并返回1
//否则指针p指向查找路径上访问的最后一个结点,返回0
int SearchBST(BiTree T,int key,BiTree f,BiTree *p){
if(!T){//查找不成功
*p=f;
return 0;
}else if(key==T->data){
*p=T;
return 1;
}else if(key<T->data){
return SearchBST(T->lchild,key,T,p);//在左子树继续查找
}else{
return SearchBST(T->rchild,key,T,p);//在右子树继续查找
}
}
//当二叉排序树T中不存在关键字等于key的数据元素树
//插入key并返回1,否者返回0
int InsertBST(BiTree *T,ElemType key){
BiTree p,s;
if(!SearchBST(*T,key,NULL,&p)){
s=(BiTree)malloc(sizeof(BiTNode));
s->data=key;
s->lchild=s->rchild=NULL;
if(!p){//查找不到key
*T=s;
}else if(key<p->data){
p->lchild=s;
}else{
p->rchild=s;
}
return 1;
}else{
return 0;//树中已有关键字相同的结点,不在插入
}
}
void cenprintf(BiTree tree){
if(tree){
cenprintf(tree->lchild);
printf("%d ",tree->data);
cenprintf(tree->rchild);
}
}
int DeleteBST(BiTree *T,int key){
if(!*T){
return 0;
}else{
if(key==(*T)->data){
return Delete(T);
}else if(key<(*T)->data){
return DeleteBST(&(*T)->lchild,key);
}else{
return DeleteBST(&(*T)->rchild,key);
}
}
}
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:用于寻找删除结点左子树上最右边的结点(值最大的结点)(删除结点的前驱结点)
q=s;
s=s->rchild;
}
(*p)->data=s->data;
//如果q==p:表明while语句循环体没有执行,即删除结点的前驱就是它的左孩子
//如果前驱是它的左孩子,就说明他前驱没有右孩子;就要把左孩子接到原前驱位置上
//否者表示前驱不为删除结点的左孩子,那么他可能有左孩子,一定没有右孩子,所以把前驱左孩子接到原前驱位置上
if(q != *p){
q->rchild=s->lchild;
}else{
q->lchild=s->lchild;
}
free(s);
}
return 1;
}
void main(){
ElemType val;
BiTree tree=(BiTree)malloc(sizeof(BiTNode));
tree->data=5;
tree->lchild=tree->rchild=NULL;
printf("请输入插入树的值:");
scanf("%d",&val);
while(-1!=val){
InsertBST(&tree,val);
printf("请输入插入树的值:");
scanf("%d",&val);
}
cenprintf(tree);
printf("\n请输入删除结点:");
scanf("%d",&val);
DeleteBST(&tree,val);
cenprintf(tree);
}平衡二叉树