深入理解 C++ 中的二叉搜索树(BST):实现与操作

   二叉搜索树(Binary Search Trees, BST) 是计算机科学中的基础数据结构,以其高效的搜索、插入和删除而闻名。在文本中,我们将深处探讨C++中BST的实现,并探讨与之相关的各种操作。

介绍二叉搜索树(BST)

二叉搜索树是一种层次化的数据结构,由节点组成,每个节点最多有两个孩子,分别称为左孩子和右孩子。BST 属性确保对于每个节点,左子树中的所有元素都小于节点的值,右子树中的所有元素都大于节点的值。

在 C++ 中的实现

提供的代码展示了 C++ 中 BST 的实现。让我们分解一下关键组件:

  1. 节点结构(Bnode

    • 定义了 BST 中节点的结构,包含数据和指向左右孩子的指针。
  2. BST 结构(Btree

    • 代表整个 BST。
  3. 插入操作(InsertBtree

    • 将新节点插入 BST 中,并通过适当遍历树来保持 BST 属性。
  4. 删除操作(DeleteNode

    • 从 BST 中删除节点,确保结果仍然是有效的 BST。
  5. 搜索操作

    • 提供了递归和迭代两种方法来搜索 BST 中的元素。
  6. 遍历

    • 使用递归方式实现了先序遍历(preOrderRec),以根、左、右的顺序访问节点。
    • #include<iostream>
      using namespace std;
      
      #define MAX_NODE 1024
      
      #define isLess(a,b)(a < b)
      #define isEqual(a,b)(a == b)
      
      typedef int Elemtype;
      
      //构建二叉搜索树结构
      typedef struct _Bnode
      {
      	Elemtype Data;		//元素类型
      	struct _Bnode* lchlid, * rchild;		//指向左右孩子结点
      }Bnode, Btree;
      
      //二叉搜索树的插入
      bool InsertBtree(Btree** root, Bnode* node)
      {
      	Bnode* tmp = NULL;
      	Bnode* parent = NULL;
      
      	if (!node)
      		return false;
      	else
      	{
      		//清空结点的左右子树
      		node->lchlid = NULL;
      		node->rchild = NULL;
      	}
      
      	if (*root)
      	{
      		//存在根节点
      		tmp = *root;
      	}
      	//不存在根节点
      	else
      	{
      		*root = node;
      		return true;
      	}
      
      	while (tmp != NULL)
      	{
      		parent = tmp;	//保存父节点
      		if (isLess(node->Data, tmp->Data))
      		{
      			tmp = tmp->lchlid;
      		}
      		else
      		{
      			tmp = tmp->rchild;
      		}
      	}
      
      	//若该树为空树,直接将node放置在根节点上
      	if (isLess(node->Data, parent->Data))
      	{
      		parent->lchlid = node;
      	}
      	else
      	{
      		parent->rchild = node;
      	}
      
      	return true;
      
      }
      
      //找到最大结点的那个值
      int findMax(Btree* root)
      {
      	if (root->rchild == NULL)
      	{
      		return root->Data;
      	}
      	return findMax(root->rchild);
      }
      
      //二叉树结点的删除
      Btree* DeleteNode(Btree* root, int key)
      {
      	if (root == NULL) return NULL;
      
      	if (root->Data > key)
      	{
      		root->lchlid = DeleteNode(root->lchlid, key);
      		return root;
      	}
      
      	if (root->Data > key)
      	{
      		root->rchild = DeleteNode(root->rchild, key);
      		return root;
      	}
      
      	//删除节点不存在左右子节点,即为叶子节点,直接删除
      	if (root->lchlid == NULL && root->rchild == NULL) return NULL;
      
      	//删除结点存在右子节点,直接用右子节点取代删除结点
      	if (root->lchlid == NULL && root->rchild != NULL) return root = root->rchild;
      
      	//删除节点存在左子节点,直接用左子节点取代删除节点
      	if (root->lchlid != NULL && root->rchild == NULL) return root = root->lchlid;
      
      	//删除节点存在左右子节点,直接用左子节点最大值取代删除结点
      	int val = findMax(root);
      	root->Data = val;
      	root->lchlid = DeleteNode(root->lchlid, val);
      	return root;
      }
      
      //二叉搜索树
      /*方式一:采用递归的方式进行搜索*/
      Bnode* queryByRec(Btree* root, Elemtype e)
      {
      	if (root == NULL || isEqual(root->Data, e))
      	{
      		return root;
      	}
      	else if (isLess(e, root->Data))
      	{
      		queryByRec(root->lchlid, e);
      	}
      	else
      	{
      		queryByRec(root->rchild, e);
      	}
      }
      
      /*方式二:采用非递归方式查找结点*/
      Bnode* queryByLoop(Btree* root, Elemtype e)
      {
      	while (root != NULL && isEqual(root->Data, e))
      	{
      		if (isLess(e, root->Data))
      		{
      			root= root->lchlid;
      		}
      		else
      		{
      			root = root->rchild;
      		}
      	}
      	return root;
      }
      
      /*二叉树的遍历*/
      //1、前序遍历
      //采用递归方式
      void pre0rderRec(Btree* root)
      {
      	if (root == NULL)
      		return;
      	cout << "-" << root->Data << "-";
      	//左右遍历
      	pre0rderRec(root->lchlid);
      	pre0rderRec(root->rchild);
      }

测试与用法

提供的 main 函数演示了通过将具有来自数组的值的节点插入到树中,并执行先序遍历以显示树的内容的 BST 操作的用法。

int main6()
{
	//提供一个数组的原材料进行测试
	int test[]{ 19,7,25,5,11,15,21,61 };

	Bnode* root = NULL, * node = NULL;

	node = new Bnode;
	node->Data = test[0];
	InsertBtree(&root, node);

	for (int i = 1; i < sizeof(test) / sizeof(test[0]); i++)
	{
		node = new Bnode;
		node->Data = test[i];
		if (InsertBtree(&root, node))
		{
			cout << "结点" << node->Data << "插入成功\n";
		}
		else
		{

		}
	}
	pre0rderRec(root);
	system("pause");
	return 0;
	
}

结论

二叉搜索树是强大的数据结构,可促进数据的高效搜索和操作。了解其实现和操作对于任何处理数据管理任务的程序员来说都至关重要。通过利用本文中提供的 C++ 代码和见解,开发人员可以有效地在其项目中利用 BST,提升应用程序的性能和可扩展性。

在随后的文章中,我们可以进一步探讨二叉搜索树的优化、高级操作以及在实际场景中的应用。敬请期待更深入的数据结构和算法讨论!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值