概念
如果一棵二叉树的每个结点对应一个关键码,并且每个结点的左子树中所有结点的码值都小于该结点的关键码值,而右子树中所有结点的码值都大于该结点的关键码值,则这个二叉树称为二叉排序树。
头文件包含
#include<stdio.h>
#include<stdlib.h>
结构描述
在二叉排序树的操作中,使用二叉链表作为存储结构。
typedef struct node
{
int key;
struct node *lchild,*rchild;
//datatype other;//其他数据
}bstnode;
构造
二叉排序树的构造是指将一个给定的数据元素序列构造为相应的二叉排序树。
对于任意的一组数据元素{R1,R2,…,Rn},可按以下方法来构造二叉排序树:
- 令R1作为二叉树的根。
- 若R2<R1,令R2为R1左子树的根结点;否则R2为R1右子树的根结点。
- 对于R3,…,Rn结点,依次与前面生成的结点比较以确定输入结点的位置。
插入
在二叉排序树中插入一个结点,可用以下的非递归插入算法来实现:
bstnode* InsertBst(bstnode *t,bstnode *s)
{
bstnode *p,*f;
p=t;
while(p!=NULL)
{
f=p;
if(s->key==p->key) return t;//树中已有该结点,无须插入
if(s->key<p->key) p=p->lchild;//在左子树中查找插入位置
else p=p->rchild;
}
if(t==NULL) return s;//原树为空,返回s作为根结点
if(s->key<f->key) f->lchild=s;
else f->rchild=s;
return t;
}
创建
从空的二叉排序树开始,生成二叉排序树的算法如下:
bstnode* CreateBst()
{
bstnode *t,*s;
int key,endflag=0;//endflag为结点结束标志
//datatype data;
t=NULL;//设置二叉排序树为空树
scanf("%d",&key);
while(key!=endflag)
{
s=(bstnode*)malloc(sizeof(bstnode));//分配新结点
s->lchild=s->rchild=NULL;
s->key=key;
//scanf("%d",&data);
//s->other=data;
t=InsertBst(t,s);
scanf("%d",&key);
}
return t;
}
删除
在二叉排序树中删除某个结点之后,要求保留下来的结点仍然保持二叉排序树的特点。
在序列中删除指定的key再重新生成新树也不是不行(bushi
bstnode* DelBstNode(bstnode* t,int k)
{
bstnode *p,*q,*s,*f;
p=t;
q=NULL;
while(p!=NULL)//查找关键字为k的待删结点
{
if(p->key==k) break;
q=p;
if(p->key>k) p=p->lchild;
else p=p->rchild;
}
if(p==NULL) return t;//找不到结点,返回原树
if(p->lchild==NULL)//p所指结点的左子树为空
{
if(q==NULL) t=p->rchild;//p为原树的根
else if(q->lchild==p) q->lchild=p->rchild;
else q->rchild=p->rchild;
free(p);
}
else
{
f=p;
s=p->lchild;
while(s->rchild!=NULL)//在pl中查找最右下的结点,即查找p的先序结点
{
f=s;
s=s->rchild;
}
if(f==p) f->lchild=s->lchild;//将s所指结点的左子树链接到*f上
else f->rchild=s->lchild;
p->key=s->key;
//p->other=s->other;
free(s);
}
return t;
}