二叉搜索树的操作

二叉树的常用操作

二叉树的结构

typedef struct node* BST;
typedef struct node* position;
struct node
{
	int data;	
	position Left;
	position Right;
};

建立空树

BST makeEmpty(BST T) //建立一颗空的二叉搜索树 ,如果二叉树不为空,可以清空树;
{
	if(T)
	{
		makeEmpty(T->Left);
		makeEmpty(T->Right);
		free(T);
	}
	return NULL;
}

查找树中元素的位置

position  findBST(BST T ,int X)
{
	if(T==NULL)
	{
		return NULL;
	}
	if(T->data > X)
	{
		return findBST(T->Left,X);
	}
	else if(T->data < X)
	{
		return findBST(T->Right);
	}
	else
	{
		return T;
	}
}

查找二叉树最大元素

position findMax(BST T) //递归实现
{	
	if(T==NULL)
	{
		return NULL}
	if(T->Right)
	{
		findMax(T->Right)}
	else
	{
		return T;
	}
}

最小元素的查找

position findMin(BST T) //循环实现
{
	if(T!==NULL)
		while(T->Left)
			T = T->Left;
	return T;
}

向二叉树中插入元素

BST InsertBST(BST T,int X)
{
	if(T==NULL)
	{
		T = (BST)malloc(sizeof(struct node));
		if (!T)
  		{
 			  return NULL;
 		 }	
		T->data = X;
		T->Left = T->Right = NULL;
	}
	else if(T->data > X)
	{
		T->Left = InsertBST(T->Left,X);
	}
	else if(T->data <X)
	{
		T->Right = InsertBST(T->Right,X);
	}
	return T;
}

二叉搜索树的删除操作(重点)
用find 函数查找到要删除元素的位置;
分3种情况 :

  1. 被删除的节点是叶节点 ,可之间删除,让其父节点指针为NULL
  2. 被删除的节点有一个子节点,让其父节点指向子节点;
  3. 被删除的节点有2个子节点,可选择右子树的最小元素,或者左子树的最大元素;代替被删除的元素;这样就把要删除的节点变成了1或2 的情况

这样做的目的是使二叉树仍为二叉搜索树;

删除操作
position DeleteBST(BST T,int X)
{
	position Tmp;
	if(T == NULL)
	{
		printf("树为空\n");
		return NULL;
	}
	else if(T->data < X)
	{
		T->Right = DeleteBST(T->Right,X);
	}
	else if(T->data > X)
	{
		T->Left = DeleteBST(T->Left,X);
	}
	else if(T->Left&& T->Right) // 要删除的节点有两个子节点
	{
		Tmp = findMin(T->Right);	//找到右子树的最小元素代替被删除的节点;
		// Tmp= findMax(T->Left); 也可以找到左子树的最大元素代替被删除的节点;
		T->data = Tmp->data;
		T->Right = DeleteBST(T->Right,T->data); // 删除右子树的最小元素;
	}
	else 
	{
		Tmp = T;
		if (T->Left == NULL)  //被删除的节点有左子树
 		{
   			T = T->Right;
		}
		else if (T->Right == NULL) //被删除的节点有右子树
		{
 		 	T = T->Left;
		}
  		free(Tmp); // 删除节点
	}
	return T;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值