目录
二叉排序树(Binary Search Tree,简称BST)是一种重要的数据结构,用于管理有序数据集合。它不仅可以快速地插入、删除和查找数据,还能够保持数据的有序性。本篇博文将详细介绍BST的原理、操作以及应用场景。
1. 什么是二叉排序树(BST)?
二叉排序树是一种二叉树,其中每个节点都包含一个数据项,且满足以下性质:
- 左子树中的所有节点的数据项都小于根节点的数据项。
- 右子树中的所有节点的数据项都大于根节点的数据项。
- 左右子树也分别为二叉排序树。
数据结构定义
#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)
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;
}
运行结果:

1309

被折叠的 条评论
为什么被折叠?



