数据结构之二叉排序树

采用二叉链表建立二叉排序树,并且对二叉排序树进行中序(非递归)遍历,查找元素是否存在,如果存在则删除二叉排序树中的该元素,如果不存在则输出该元素。

此处二叉排序树采用递减,所以在遍历过程中先访问右孩子再访问左孩子。

C语言源代码如下:

#include<stdio.h>
#include<stdlib.h> 
#define STACKSIZE 20
#define INCREASESIZE 20

typedef struct BiTNode{
    int data;                          
    struct BiTNode *lchild,*rchild;       
	}BiTNode,*BiTree;                   
typedef struct {
	BiTree *base;
	int top;
	int stacksize;
}SqStack;

void CreatBiTree(BiTree &T,int a[],int n)
{// 建立一个链表
    BiTree p,f,s;
	   if(n<1)
	   { 
		   T=NULL;
		   return;
	   }
	   T=(BiTree)malloc(sizeof(BiTNode));
		T->data =a[0];
		T->lchild =T->rchild =NULL;
		for(int i=0;i<n;i++)
		{
		f=NULL;
		p=T;
		while(p)
		if(p->data==a[i])	break;
		else if(a[i]<p->data )
		{
			f=p;
		    p=p->lchild ;
		}
		else
		{
		        f=p;
				p=p->rchild;
}
		
		if(!p)
		{
                s=(BiTree)malloc(sizeof(BiTNode)) ;
			    s->data =a[i];
		     	s->lchild =s->rchild =NULL;
			if(s->data<f->data)
				f->lchild =s;
			  
			else 
                f->rchild=s;
		}
	}
}

void InitStack(SqStack &S)
{//初始化一个栈
	S.base=(BiTree*)malloc(STACKSIZE*sizeof(BiTree));
	if(!S.base)
		exit(0);
	S.top=0;
	S.stacksize=STACKSIZE;
}

void Push(SqStack &S,BiTree e)
{//在栈S中插入新的元素e
	if(S.top>=S.stacksize)
	{
		S.base=(BiTree*)malloc((STACKSIZE+INCREASESIZE)*sizeof(BiTree));
		S.stacksize+=INCREASESIZE;
	}
	S.base[S.top++]=e;
}
void Pop(SqStack &S,BiTree &e)
{//删除栈顶元素并用e返回元素的值
	if(S.top==0)
		return;
	e=S.base[--S.top];
}
int GetTop(SqStack S,BiTree &e)
{//取栈顶元素
	if(S.top==0)
		return 0;
	e=S.base[S.top-1];
	return 1;
}
int EmptyStack(SqStack S)
{//判断栈是否为空
	if(S.top==0)
		return 1;
	return 0;
}

void InOrderTraverse(BiTree T)
{//非递归中序遍历
	SqStack S;
	BiTree p;
	if(T)
	{
		InitStack(S);
		Push(S,T);
		while(!EmptyStack(S))
		{
			while(GetTop(S,p) && p)
				Push(S,p->rchild);
			Pop(S,p);
			if(!EmptyStack(S))
			{
				Pop(S,p);
				printf("%3d",p->data);
				Push(S,p->lchild);
			}
		}
	}
}

int Delete(BiTree &p)
{//从二叉排序树中删除结点p
    BiTree q,s;
	if(!p->rchild)
	{
		q=p;
		p=p->lchild;
		free(q);
	}
	else if(!p->lchild)
	{
		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;
		if(q!=p)
			q->rchild=s->lchild;
		else
			q->lchild=s->lchild;
		delete s;
	}
	return 1;
}

int DeleteBIT(BiTree &T,int key)
{//若存在关键字则删除,不存在则输出
	if(!T)
	{
		printf("二叉排序树中不存在所要删除的关键字%d!\n",key);
		exit(0);
	}
	else
	{
		if(key==T->data)
		{
			return Delete(T);
		}
		else if(key<T->data)
			return DeleteBIT(T->lchild,key);
		else
			return DeleteBIT(T->rchild,key);
	}
}
int main()
{ 
   int a[100],n,key; 
   BiTree T;
   printf("请输入元素个数:\n");
   scanf("%d",&n);
   printf("请输入元素值:\n");
   for(int i=0;i<n;i++)
	   scanf("%d",&a[i]);
   CreatBiTree(T,a,n);
   printf("二叉排序树为:\n");
   InOrderTraverse(T);
   printf("\n输入要查找删除的关键字:\n");
   scanf("%d",&key);
   DeleteBIT(T,key);
   printf("删除结点后的二叉排序树为:\n");
   InOrderTraverse(T);
   printf("\n");
   return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值