BST二叉查找树的实现与操作

教学视频地址

原文来自猎豹网校


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

typedef struct Node
{
	int data;
	struct Node *lchild;
	struct Node *rchild;
}BiTreeNode,*BiTree;

BiTree BSTSearch(BiTree T,int x)
{
	BiTreeNode *p;
	if(T!=NULL)
	{	
		p=T;
		while(p!=NULL)
		{
			if(p->data==x)
				return p;
			else if(x<p->data)
				p=p->lchild;
			else if(x>p->data)
				p=p->rchild;
		}
	}
	return NULL;
}

int BSTInsert(BiTree *T,int x)
{
	BiTreeNode *p,*cur,*parent=NULL;
	cur=*T;
	while(cur!=NULL)
	{
		if(cur->data==x)
			return 0;//已存在关键字为x的节点
		parent=cur;
		if(x<cur->data)
			cur=cur->lchild;
		else
			cur=cur->rchild;
	}
	p=(BiTreeNode *)malloc(sizeof(BiTreeNode));
	if(!p)
		exit(-1);
	p->data=x;
	p->lchild=NULL;
	p->rchild=NULL;
	if(!parent)
		*T=p;
	else if(x<parent->data)//如果关键字小于parent指向的节点,则新节点成为parent左孩子
		parent->lchild=p;
	else 
		parent->rchild=p;
	return 1;
}
//删除结点操作
void DeleteNode(BiTree *s)
{
	BiTree q,x,y;
	if(!(*s)->rchild)
	{
		q=*s;
		*s=(*s)->lchild;
		free(q);
	}
	else if(!(*s)->lchild)
	{
		q=*s;
		*s=(*s)->rchild;
		free(q);
	}
	else//如果s左右子树都存在,则使s的直接前驱结点代替s,并使直接前驱结点的左子树成为成为双亲节点的右子树结点。
	{
		x=*s;
		y=(*s)->lchild;
		while(y->rchild!=NULL)//查找s的直接前驱结点y为s的直接前驱结点,x为y的双亲结点
		{
			x=y;
			y=y->rchild;
		}
		(*s)->data=y->data;//结点s被y取代
		if(x!=*s)
			x->rchild=y->lchild;//使y的左子树成为x的右子树
		else//如果s的左孩子结点不存在右子树
			x->lchild=y->lchild;
		free(y);
	}
}
//删除特定结点操作
int BSTDelete(BiTree *T,int x)
{
	if(!*T)
	return 0;
	else
	{
		if(x==(*T)->data)
			DeleteNode(T);
		else if((*T)->data>x)
			BSTDelete(&(*T)->lchild,x);
		else 
			BSTDelete(&(*T)->rchild,x);
	}
}

void InOrderTraverse(BiTree T)
{
	if(T)
	{
		InOrderTraverse(T->lchild);
		printf("%4d",T->data);
		InOrderTraverse(T->rchild);
	}
}


posted on 2013-05-14 19:25  果冻虾仁  阅读(120)  评论(0编辑  收藏  举报

导航