二叉排序树(BST)

        

目录

1. 什么是二叉排序树(BST)?

数据结构定义

2. 插入操作

3. 删除操作

4. 查找操作

5. 应用场景

6. 完整示例代码


        二叉排序树(Binary Search Tree,简称BST)是一种重要的数据结构,用于管理有序数据集合。它不仅可以快速地插入、删除和查找数据,还能够保持数据的有序性。本篇博文将详细介绍BST的原理、操作以及应用场景。

1. 什么是二叉排序树(BST)?

二叉排序树是一种二叉树,其中每个节点都包含一个数据项,且满足以下性质:

  1. 左子树中的所有节点的数据项都小于根节点的数据项。
  2. 右子树中的所有节点的数据项都大于根节点的数据项。
  3. 左右子树也分别为二叉排序树。
数据结构定义
#define ElemType int
typedef struct BSTreeNode {
	ElemType data;		//节点所存储的数据
	struct BSTreeNode* lchild, * rchild;//左右孩子指针
}BSTreeNode,*BSTree;

2. 插入操作

        在BST中插入一个新的数据项的操作是通过搜索来完成的。从根节点开始,将新数据项与节点数据项进行比较,根据大小关系决定向左子树或右子树搜索。当找到一个空位置时,插入新数据项。

bool BST_Insert(BSTree& T, int data) {
	if (T == NULL) {
		BSTreeNode* p = (BSTreeNode*)malloc(sizeof(BSTreeNode));
		p->data = data;
		p->lchild = NULL;
		p->rchild = NULL;
		T = p;
		return true;//插入成功
	}
	else if (T->data == data)
		return false;
	else if (T->data < data)
		return BST_Insert(T->rchild, data);
	else
		return BST_Insert(T->lchild, data);
}

3. 删除操作

BST中删除一个数据项的操作较为复杂,因为需要保持树的有序性。有三种情况需要考虑:

  1. 被删除节点没有子节点,直接删除。(叶子节点)
  2. 被删除节点只有一个子节点,将子节点移至被删除节点的位置。(度为1)
  3. 被删除节点有两个子节点,需要找到其后继节点(右子树中最小的节点),将后继节点的数据项赋值给被删除节点,然后删除后继节点。(度为2)

4. 查找操作

        在BST中查找一个数据项的操作也是通过搜索来完成的。从根节点开始,将目标数据项与节点数据项进行比较,根据大小关系决定向左子树或右子树搜索,直到找到目标数据项或搜索到叶节点为止。

BSTreeNode* find(BSTree T, int data) {
	while (T != NULL && T->data != data) {
		if (data > T->data)
			T = T->rchild;
		else
			T = T->lchild;
	}
	return T;
}

5. 应用场景

二叉排序树适用于需要高效地管理有序数据的场景,例如:

  • 数据库索引:数据库中的索引通常使用BST来快速检索数据。
  • 字典:字典数据结构中的键值对可以通过BST来组织和查找。

6. 完整示例代码

以下是一个简单的BST的示例代码:

#include<iostream>
using namespace std;

//定义
#define ElemType int
typedef struct BSTreeNode {
	ElemType data;		//节点所存储的数据
	struct BSTreeNode* lchild, * rchild;//左右孩子指针
}BSTreeNode, * BSTree;
//访问节点
void visit(BSTreeNode* TNode) {
	cout << TNode->data << " ";
}
//查找
BSTreeNode* find(BSTree T, int data, BSTreeNode*& pre) {
	while (T != NULL && T->data != data) {
		pre = T;
		if (data > T->data)
			T = T->rchild;
		else
			T = T->lchild;
	}
	return T;
}
//插入
bool BST_Insert(BSTree& T, int data) {
	if (T == NULL) {
		BSTreeNode* p = (BSTreeNode*)malloc(sizeof(BSTreeNode));
		p->data = data;
		p->lchild = NULL;
		p->rchild = NULL;
		T = p;
		return true;//插入成功
	}
	else if (T->data == data)
		return false;
	else if (T->data < data)
		return BST_Insert(T->rchild, data);
	else
		return BST_Insert(T->lchild, data);
}
//构造BST
void CreateBST(BSTree& T, int a[], int n) {
	for (int i = 0; i < n; i++) {
		BST_Insert(T, a[i]);
	}
}
//中序遍历
void InOrder(BSTreeNode* T) {
	if (T != NULL) {
		InOrder(T->lchild);
		visit(T);
		InOrder(T->rchild);
	}
}
int main() {
	BSTree BST = NULL;
	int a[] = { 50,66,60,26,21,30,70,68 };
	CreateBST(BST, a, 8);
	InOrder(BST);
	return 0;
}

  运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想学习啊啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值