数据结构:二叉排序树(Binary Sort Tree,Bst)

概念

如果一棵二叉的每个结点对应一个关键码,并且每个结点的左子中所有结点的码值都小于该结点的关键码值,而右子中所有结点的码值都大于该结点的关键码值,则这个二叉树称为二叉排序树。

头文件包含

#include<stdio.h>
#include<stdlib.h>

结构描述

在二叉排序树的操作中,使用二叉链表作为存储结构。

typedef struct node
{
	int key;
	struct node *lchild,*rchild;
	//datatype other;//其他数据 
}bstnode;

构造

二叉排序树的构造是指将一个给定的数据元素序列构造为相应的二叉排序树。
对于任意的一组数据元素{R1,R2,…,Rn},可按以下方法来构造二叉排序树:

  1. 令R1作为二叉树的根。
  2. 若R2<R1,令R2为R1左子树的根结点;否则R2为R1右子树的根结点。
  3. 对于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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值