一、二叉搜索树的概念
二叉搜索树(Binary Search Tree)节点放置:任何节点的键值一定大于其左子树的每一个节点的键值,并小于其右子树的每一个节点的键值。
因此,找出BST树的最大元素和最小元素,就是从根节点一直往左走,直至无左路可走,即得最小元素;从根节点一直往右走,直至无右路可走,即得最大元素。
二、二叉搜索树的查找操作
1、二叉树结构定义
//二叉树的二叉链表节点结构定义
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
查找操作:
bool SearchBST(BiTree T,int key,BiTree *p)
{
if(!T){ //查找不成功
*p = NULL; //p是查找成功之后的节点位置
return false;
}else if(key ==T->data)
{
*p = T;
return true;
}else if(key < T->data)
return SearchBST(T->lchild,key,p);
else
return SearchBST(T->rchild,key,p);
}
三、二叉搜索树的插入操作
BST树插入新元素时,从根节点开始,遇到键值较大的值就向左,遇到较小的就向右,一直到尾端,就是插入点。
bool InsertBST(BiTree *T,int key)
{
BiTree p,s;
if(!SearchBST(*T,key,&p)) //没有查找到
{
s = (BiTree)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = s->rchild = NULL;
if(!p)
*T = s; //没有查找到则,p为NULL,s从根节点开始
else if(key <p->data)
p->lchild = s;
else
p->rchild = s;
return true;
}
else
return false; //树中有相同的点
}
四、二叉搜索树的删除操作
删除无非两种情况:如果A只有一个子节点,就直接将A的子节点连至A的父节点,并将A删除;如果A有两个子节点,就以右子树的最小节点或左子树的最大节点取代A即可。
扫描二维码关注公众号,回复:
1801027 查看本文章
bool DeleteBST(BiTree *T,int key)
{
if(!*T) //树空
return false;
else
{
if(key == (*T)->data) //找到关键字==key的数据
return Delete(T);
else if(key <(*T)->data)
return DeleteBST(&(*T)->lchild,key);
else
return DeleteBST(&(*T)->rchild,key);
}
}
bool Delete(BiTree *p)
{
BiTree q,s; //辅助指针
if((*p)->rchild == NULL){ //右子树为空
q=*p; //先保存节点,然后将左孩子指针赋给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; //将最大节点的值赋给p
if(q!=*p)
q->rchild = s->lchild;
else
q->lchild = s->lchild;
free(s);
}
return true;
}
图解: