使得二叉树成为二叉查找树的关键就是令树中的每个节点的左子树的关键值小于X的关键值,它的右子树中所有的关键字大于X的关键字。
本文主要介绍二叉查找树的实现和基本的插入和删除操作
头文件声明如下
#ifndef ADT_H_
#define ADT_H_
struct ADT;
typedef struct ADT *ADtree;
typedef struct ADT *Position;
//查找函数,查找某个元素的所在节点的地址
Position Find(ADtree t,int X);
//查找最大值,最小值函数,查找最大值和最小值所在节点的地址
Position Findmax(ADtree t);
Position Findmin(ADtree t);
//插入函数,插入一个节点
ADtree Insert(ADtree t,int X);
//删除函数,删除一个节点
ADtree Delete(ADtree t,int X);
#endif // ADT_H_
二叉查找树的定义以及基本操作的定义
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
struct ADT
{
int element;
Position left;
Position right;
};
//查找函数,查找某个元素的所在节点的地址
Position Find(ADtree t,int X)
{
if(t==NULL)
return NULL;
else
{
Position tem=t;
while(tem!=NULL)
{
if(X<tem->element)
tem=tem->left;
if(X>tem->element)
tem=tem->right;
if(X==tem->element)
return tem;
}
if(tem==NULL)
return NULL;
}
}
//查找最大值,最小值函数,查找最大值和最小值所在节点的地址
Position Findmax(ADtree t)
{
if(t==NULL)
return NULL;
if(t->right==NULL)
return t;
else
return Findmax(t->right);
}
Position Findmin(ADtree t)
{
if(t==NULL)
return NULL;
if(t->left==NULL)
return t;
else
return Findmin(t->left);
}
//插入函数,插入一个节点
ADtree Insert(ADtree t,int X)
{
if(t==NULL)
{
t=malloc(sizeof(struct ADT));
t->left=NULL;
t->right=NULL;
t->element=X;
printf("insert success\n");
}
else
{
Position p_tem=t;
if(X>p_tem->element)
{
t->right=Insert(p_tem->right,X);
}
if(X<p_tem->element)
{
t->left=Insert(p_tem->left,X);
}
}
return t;
}
//遍历树
void print(Position p,int dep)
{
if(p!=NULL)
{
int i=0;
for(;i<dep;i++)
printf(" ");
printf("%d\n",p->element);
}
}
void traverse(ADtree t,int d)
{
if(t!=NULL)
{
print(t,d);
traverse(t->left,d+1);
traverse(t->right,d+1);
}
}
//删除函数,删除一个节点
ADtree Delete(ADtree t,int X)
{
if(t==NULL)
return t;
else
{
if(X>t->element)
t->right=Delete(t->right,X);
if(X<t->element)
t->left=Delete(t->left,X);
if(X==t->element)
{
if(t->left!=NULL&&t->right!=NULL)
{
Position p_tem=Findmin(t->right);
t->element=p_tem->element;
t->right=Delete(t->right,p_tem->element);
}
else
{
Position p=t;
if(p->left==NULL)
{
t=t->right;
free(p);
}
else if(p->right==NULL)
{
t=t->left;
free(p);
}
}
}
return t;
}
}