BSF二叉查找树

《BSF二叉查找树》《BSF二叉查找树》

头文件

<pre name="code" class="cpp">#include<stdio.h>
#include<stdlib.h>
typedef struct node //定义二叉树类型
{
	int data;
	struct node *lchild;
	struct node *rchild;


}BiTreeNode, *BiTree;
//二叉树查找树的查找,如果找到关键字为x,则返回指向结点的指针,否则返回NULL;
BiTree BSTSearch(BiTree T, int x)
{
	BiTree p;
	if (T != NULL)
	{
		p = T;
		while (p != NULL)
		{
			if (p->data == x)
			{
				return p;//返回其指针
			}
			else if (x < p->data)//如果x小于结点数,x在其p的左子树中
			{
				p = p->lchild;
			}
			else if (x>p->data)//如果x>结点元素,x在其p的右梓树中,就在柚子树中查找
			{
				p = p->rchild;
			}
		}
		

	}
	return NULL;

}
//二叉查找树的插入操作
//插入成功返回1,失败0
int BSTInsert(BiTree *T, int x)
{
	BiTree p, cur, parent = NULL;
	cur = *T;
	while (cur != NULL)
	{
		if (cur->data == x)//已经存在关键字为x的结点,插入失败
		{
			return 0;
		}
		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<<<<<<<<<与上面相同
			parent->rchild = p;
		return 1;
	
}
//从二叉查找树种删除结点s,并使该二叉查找树性质不变
void DeleteNode(BiTree *s)
{
	BiTree q, x, y;
	if (!(*s)->rchild)//如果该结点没有柚子树则 s的左子树成为被删除结点的双亲结点的左子树
	{
		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 )//查找s的直接前驱结点,y为s的直接前驱结点.x为y的双亲结点
		{
			x = y;
			y = x->rchild;
		}
		(*s)->data = y->data;//结点s被y取代
		if (x != *s)//如果结点s的左孩子结点不存在右梓树的话,
		{
			x -> rchild = y->lchild;//使y的左子树成为x其柚子树
		}
		else
		{
			x->lchild = y->lchild;
		}
		free(y);
	}
		
}
//在二叉查找树种找到关键字为x的结点,并进行删除之,删除成功返回1,否则返回0
int BSTDelete(BiTree *T, int x)
{
	if (!*T)
		return 0;
	else
	{
		if (x == (*T)->data)//找到其x就删除
		{
			DeleteNode(T);
		}
		else if ((*T)->data > x)
		{
			BSTDelete(&((*T)->lchild), x);
		}
		else
			BSTDelete(&((*T)->rchild), x);
		return 1;
	}
}
void zhongxu(BiTree T)
{
	if (T)
	{
		zhongxu(T->lchild);
		printf("%4d", T->data);
		zhongxu(T->rchild);

	}
}

主函数

#include"BiTree1.h"

int main()
{
	BiTree T = NULL;
	BiTree p;
	int table[] = { 37, 32, 35, 62, 82, 95, 73, 12, 5, 99 };
	int n = sizeof(table) / sizeof(int);
	int x = 74, s = 12;
	for (int i = 0; i < n; i++)
	{
	    int j=BSTInsert(&T, table[i]);
		//printf("%d\n", j);
	}
	
	printf("中序遍历二叉查找树得到的序列\n");
	   zhongxu(T);
		p = BSTSearch(T, x);
		if (p != NULL)
			printf("\n二叉查找树关键字%d存在\n",x);
		else
			printf("查找失败!\n");
	
	BSTDelete(&T, s);//删除关键字
	printf("删除元素%d后,中序遍历二叉查找树得到的序列\n", s);
	zhongxu(T);
	system("pause");
	return 0;
}

《BSF二叉查找树》

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/u011391093/article/details/41544345
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞