二叉排序树(Binary Sort Tree)又叫做二叉查找树。
性质:
若它的左子树不为空,则左子树上所有的节点的值均小于根节点的值;
若它的右子树不为空,则右子树上所有的节点的值均大于根节点的值;
它的左、右子树也分别为二叉排序树;
二叉树的二叉链表节点结构定义:
typedef struct BiTNode //节点结构
{
int data; //数据点
struct BiNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
二叉排序树的查找算法实现:
/**
* 递归查找二叉排序树T中是否存在key
* 指针f指向T的双亲,其初始化调用值为NULL
* 若查找成功,则指针p指向该数据元素节点,并返回TRUE
* 否则指针p指向查找路径上访问的最后一个节点并返回FALSE
*/
Status SearchBST(BiTree T,int key, BiTree f,BiTree *p)
{
if(!T) //查找失败
{
*p = f;
return FALSE;
}
else if (key == T->data) //查找成功
{
*p = T;
return TRUE;
}
else if(key < T->data)
return SearchBST(T->lchild, key, T, p); //在左子树继续查找
else
return SearchBST(T->rchild, key, T, p); //在右子树继续查找
}
二叉排序树插入操作:
/**
* 二叉排序树的插入操作
* 当二叉排序树T中中不存在关键字等于Key的数据元素时
* 插入key并返回true,否则返回false
*/
Status InsertBST(BiTree *T, int 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)
*T = s; //插入s为新的根节点
else if(key < p->data)
p->lchild = s; //插入s为左孩子
else
p->rchild = s; //插入s为右孩子
return TRUE;
}
else
{
return FALSE; //树中已经有关键字相同的节点,不再插入
}
}