十九、数据结构之二叉查找树

博客提到二叉查找树的实现思想与前面的二叉树大同小异,建议通过代码去理解其具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里不做解释了,可以看前面的二叉树的实现,思想大同小异,具体可以看代码去理解

 

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

//定义二叉查找树的存储结构
typedef struct TreeNode
{
	int data; //数据域
	struct TreeNode *leftChild; //左孩子指针域
	struct TreeNode *rightChild; //右孩子指针域
}TreeNode, *Position ,*SearchTree;

//初始化树
void Init(SearchTree *tree)
{
	(*tree) = NULL;
}

//清空树
void Empty(SearchTree *tree)
{
	if((*tree) != NULL)
	{
		Empty(&(*tree) -> leftChild);
		Empty(&(*tree) -> rightChild);
		free((*tree));
	}
	(*tree) = NULL;
}

//插入元素, 这个方法不考虑重复元素, 只提供思路
void Insert(SearchTree *tree, int data)
{
	if((*tree) == NULL)
	{
		(*tree) = (SearchTree)malloc(sizeof(TreeNode));
		(*tree) -> data = data;
		(*tree) -> leftChild = (*tree) -> rightChild = NULL;
	}
	else if(data < (*tree) -> data)
	{
		SearchTree leftTree = (*tree) -> leftChild;
		Insert(&leftTree, data);
		(*tree) -> leftChild = leftTree;
	}
	else if(data > (*tree) -> data)
	{
		SearchTree rightTree = (*tree) -> rightChild;
		Insert(&rightTree, data);
		(*tree) -> rightChild = rightTree;
	} 
}

//通过值来寻找节点
Position Find(SearchTree tree, int data)
{
	if(tree == NULL)
	{
		return NULL;	
	} 
	else if(data < tree -> data)
	{
		return Find(tree -> leftChild, data);
	}
	else if(data > tree -> data)
	{
		return Find(tree -> rightChild, data);
	}
	else
	{
		return tree;
	}
}

//寻找最小的节点
Position FindMin(SearchTree tree)
{
	if(tree == NULL)
	{
		return NULL;
	}
	else if(tree -> leftChild == NULL)
	{
		return tree;
	}
	else
	{
		return FindMin(tree -> leftChild);
	}
}

//寻找最大的结点
Position FindMax(SearchTree tree)
{
	if(tree == NULL)
	{
		return NULL;
	}
	else if(tree -> rightChild == NULL)
	{
		return tree;
	}
	else
	{
		return FindMax(tree -> rightChild);
	}
}

//删除指定结点, 根据提供的结点值
void Delete(SearchTree *tree, int data)
{
	Position tmp;
	if((*tree) == NULL)
	{
		return;
	}
	else if(data < (*tree) -> data)
	{
		Delete(&((*tree) -> leftChild), data);
	}
	else if(data > (*tree) -> data)
	{
		Delete(&((*tree) -> rightChild), data);
	}
	else if((*tree) -> leftChild != NULL && (*tree) -> rightChild != NULL)
	{ 
		tmp = FindMin((*tree) -> rightChild);
		(*tree) -> data = tmp -> data;
		SearchTree rightTree = (*tree) -> rightChild;
		Delete(&rightTree, (*tree) -> data);
		(*tree) -> rightChild = rightTree;
	}
	else
	{
		tmp = (*tree);
		if((*tree) -> leftChild == NULL)
		{
			(*tree) = (*tree) -> rightChild;
		}
		else if((*tree) -> rightChild == NULL)
		{
			(*tree) = (*tree) -> leftChild;
		}
		free(tmp);
	}
	
}

int main(void)
{
	SearchTree tree;
	Init(&tree);
	Insert(&tree, 2);
	Insert(&tree, 1);
	Insert(&tree, 3);
	Insert(&tree, 4);
	// printf("%d\n", tree -> data);
	// printf("%d\n", tree -> leftChild -> data);
	// printf("%d\n", tree -> rightChild -> data);
	// printf("%d\n", tree -> rightChild -> rightChild -> data);
	//Empty(&tree);
	// if(tree == NULL)
	// {
	// 	printf("%s\n", "hello");
	// }
	// Position p = Find(tree, 3);
	// printf("%d\n", p -> rightChild -> data);
	//Position p = FindMin(tree);
	Delete(&tree, 4);
	Position p = FindMax(tree);
	printf("%d\n", p -> data);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值