采用二叉链表建立二叉排序树,并且对二叉排序树进行中序(非递归)遍历,查找元素是否存在,如果存在则删除二叉排序树中的该元素,如果不存在则输出该元素。
此处二叉排序树采用递减,所以在遍历过程中先访问右孩子再访问左孩子。
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;
}