二叉排序树的定义:
二叉排序树(Binary Sort Tree)
空树or具有以下性质的二叉树
1>若左子树不空,则左子树上所有的结点小于根节点的值。
2>若右子树不空,则右子树上所有的结点大于根节点的值。
3>左右子树也分别是二叉排序树。
二叉排序树的特点:
中序遍历二叉树关键码有序
顺带一提关键码的定义:
关键码(Key)是数据结构(或记录)中某个数据项的值,用它可以标示一个数据元素(或记录)
关键码是在查找中的名词因此查找的定义便是:
查找(Searching)是指在含有n个数据元素的查找表中,找出关键码等于给定值kx的数据元素(或记录)
二叉排序树结点的定义如下:
typedef struct bistnode
{
datatype data;
struct bistnode *lchild,*rchild;
}BiSTNode,*BiSTree;
二叉排序树中插入一个结点:
BiSTree BST_InsertNode(BiSTree t,int kx)
{
BiSTNode *f,*p,*s;
p=t;
while(p)
{
if(kx==p->data)
{
printf("kx已存在,不需插入");
return(t);
}
else{
f=p;
if(kx<p->data) p=p->lchild;
else p=p->rchild;
}
}
s=(BiSTNode *)malloc(sizeof(BiSTNode));
s->data=kx;
s->lchild=NULL;
s->rchild=NULL;
if(!t) t=s;
else if(kx<f->data) f->lchild=s;
else f->rchild=s;
return t;
}
构造一棵二叉排序树:
BiSTree BST_Creat()
{
BiSTree t=NULL;
int kx;
scanf("%d",&kx);
while(kx!=0)
{
t=BST_InsertNode(t,kx);
scanf("%d",&kx);
}
return(t);
}
合在一起:
#include <stdio.h>
#include <stdlib.h>
int keydata[11]={63,90,70,55,67,42,98,83,10,45,58};
typedef int datatype;
typedef struct bistnode
{
datatype data;
struct bistnode *lchild,*rchild;
}BiSTNode,*BiSTree;
BiSTree BST_InsertNode(BiSTree t,int kx)
{
BiSTNode *f,*p,*s;
p=t;
while(p)
{
if(kx==p->data)
{
printf("kx已存在,不需插入");
return(t);
}
else{
f=p;
if(kx<p->data) p=p->lchild;
else p=p->rchild;
}
}
s=(BiSTNode *)malloc(sizeof(BiSTNode));
s->data=kx;
s->lchild=NULL;
s->rchild=NULL;
if(!t) t=s;
else if(kx<f->data) f->lchild=s;
else f->rchild=s;
return t;
}
BiSTree BST_Creat()
{
BiSTree t=NULL;
int kx,i=0;
while(i<11)
{
kx=keydata[i];
t=BST_InsertNode(t,kx);
i++;
}
return(t);
}
void PreOrderTraversal(BiSTree t)
{
if(t)
{
printf("%d ",t->data);
PreOrderTraversal(t->lchild);
PreOrderTraversal(t->rchild);
}
}
void MidOrderTraversal(BiSTree t)
{
if(t)
{
MidOrderTraversal(t->lchild);
printf("%d ",t->data);
MidOrderTraversal(t->rchild);
}
}
int main()
{
BiSTree t;
BiSTNode b;
t=BST_Creat();
MidOrderTraversal(t);
return 0;
}
测试运行结果:
既然是查找那一定就有对关键码进行查找操作的函数: