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

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

 

#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉查找树在查找中有重要的应用。它是一满足以下两个条件的二叉:对于中的每个节点X,它的左子中所有项的值都要小于X中的项;对于中的每个节点Y,它的右子中所有项的值都要大于Y中的项。这特点使得二叉查找树在查找操作中非常高效。 一常见的应用是在二叉排序中实现中序遍历,可以通过中序遍历得到一个升序的数列。在给定的代码中,InOrder函数通过递归实现了二叉排序中序遍历。它将的左子进行中序遍历,然后将根节点的值存入数组,最后再对的右子进行中序遍历。isOrder函数则用于判断一个数列是否升序。它通过遍历数列中的每个元素,判断当前元素是否大于前一个元素来判断数列是否升序。 因此,二叉查找树的应用主要是用于高效的查找操作,并且可以通过中序遍历获取升序的数列。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++二叉查找树实现过程详解](https://download.csdn.net/download/weixin_38727980/13758023)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [数据结构-二叉查找树的应用](https://blog.csdn.net/Junds0/article/details/121791335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值