今天我主要学习了二叉排序树(Binary Search Tree,简称 BST)的基本操作,包括:
-
非递归插入与查找实现
-
递归插入实现
-
节点删除实战
二叉排序树是一种重要的数据结构,在查找、排序、以及后续平衡树(如 AVL、红黑树)等算法中有广泛应用。下面将所写代码分享给大家。
一、二叉排序树(非递归插入版)
//二叉排序树
typedef struct bitree {
int data;
struct bitree* lchild, * rchild;
}bitree,*pbitree;
// 初始化数组,随机生成数据
void init_arr(int* arr, int arr_len)
{
for (int i = 0; i < arr_len; i++)
{
arr[i] = rand() % 100;
}
}
// 中序遍历(递归实现)
void in_order(pbitree tree)
{
if(tree)
{
in_order(tree->lchild);
printf("%-3d", tree->data);
in_order(tree->rchild);
}
}
// 二叉排序树插入(非递归写法)
void insert_bst(pbitree &tree, int key)
{
pbitree parent = NULL;
if (tree == NULL)
{
tree = (pbitree)malloc(sizeof(bitree));
tree->lchild = NULL;
tree->rchild = NULL;
tree->data = key;
return;
}
pbitree p = tree;// 用p来遍历;
while (p)
{
parent = p;// p为空前保存父节点
if (key == p->data)
{
return;
}
if (key < p->data)
{
p = p->lchild;
}
else if (key > p->data)
{
p = p->rchild;
}
}
pbitree pnew = (pbitree)calloc(1, sizeof(bitree));
pnew->data = key;
if (parent->data > key)
{
parent->lchild = pnew;
}
else if (parent->data < key)
{
parent->rchild = pnew;
}
}
// 构建二叉排序树
void creat_bst(pbitree &tree, int* arr, int arr_len)
{
for (int i = 0; i < arr_len; i++)
{
insert_bst(tree, arr[i]);
}
}
// 查找指定关键字
bool search_key(pbitree tree, int key, pbitree &parent)
{
while (key != tree->data)
{
if (tree == NULL)
{
return false;
}
parent = tree;
if (key < tree->data)
{
tree = tree->lchild;
}
else if (key > tree->data)
{
tree = tree->rchild;
}
}
return true;
}
int main()
{
pbitree tree = NULL;
srand(time(NULL));
int arr[10] = { 0 };
init_arr(arr, 10);
creat_bst(tree, arr, 10);// bst->binary search tree
in_order(tree);
pbitree parent = NULL;
int key = 0;
scanf("%d", &key);
bool ret = search_key(tree, key, parent);
if (ret)
{
printf("success,and the parent key is&d", parent->data);
}
return 0;
}
二、二叉排序树(递归插入版)
//递归写法
typedef struct bitree {
int data;
struct bitree* lchild, * rchild;
}bitree, * pbitree;
// 初始化数组
void init_arr(int* arr, int arr_len)
{
for (int i = 0; i < arr_len; i++)
{
arr[i] = rand() % 100;
}
}
// 中序遍历
void in_order(pbitree tree)
{
if (tree)
{
in_order(tree->lchild);
printf("%-3d", tree->data);
in_order(tree->rchild);
}
}
// 二叉排序树插入(递归写法)
int insert_bst1(pbitree &tree, int key)
{
if (tree == NULL)
{
tree = (pbitree)malloc(sizeof(bitree));
tree->lchild = tree->rchild = NULL;
tree->data = key;
return 1;
}
if (key == tree->data)
{
return 0;
}
else if (key < tree->data)
{
insert_bst1(tree->lchild, key);
}
else if (key > tree->data)
{
insert_bst1(tree->rchild, key);
}
}
// 构建二叉排序树
void creat_bst(pbitree& tree, int* arr, int arr_len)
{
for (int i = 0; i < arr_len; i++)
{
insert_bst1(tree, arr[i]);
}
}
int main()
{
pbitree tree = NULL;
srand(time(NULL));
int arr[10] = { 0 };
init_arr(arr, 10);
creat_bst(tree, arr, 10);// bst->binary search tree
in_order(tree);
return 0;
}
三、二叉排序树删除操作实战
实现了 BST 的删除操作,分三种情况处理:
1️⃣ 叶子节点:直接删除。
2️⃣ 只有一个子树:用子树替代当前节点。
3️⃣ 有两个子树:用左子树的最大节点(或右子树最小节点)替代当前节点,再删除该节点。
//二叉排序树 删除实战
typedef struct bitree {
int data;
struct bitree* lchild, * rchild;
}bitree, * pbitree;
// 中序遍历
void in_order(pbitree tree)
{
if (tree)
{
in_order(tree->lchild);
printf("%-3d", tree->data);
in_order(tree->rchild);
}
}
// 插入(递归写法)
int insert_bst1(pbitree &tree, int key)
{
if (tree == NULL)
{
tree = (pbitree)malloc(sizeof(bitree));
tree->lchild = tree->rchild = NULL;
tree->data = key;
return 1;
}
if (key == tree->data)
{
return 0;
}
else if (key < tree->data)
{
insert_bst1(tree->lchild, key);
}
else if (key > tree->data)
{
insert_bst1(tree->rchild, key);
}
}
// 构建BST
void creat_bst(pbitree& tree, int* arr, int arr_len)
{
for (int i = 0; i < arr_len; i++)
{
insert_bst1(tree, arr[i]);
}
}
// 删除节点
int delete_bitree(pbitree &tree, int key)
{
if (tree == NULL)
{
return 0;
}
if (key < tree->data)
{
delete_bitree(tree->lchild, key);
}
else if (key > tree->data)
{
delete_bitree(tree->rchild, key);
}
else
{
if (tree->lchild == NULL)
{
pbitree tmp = tree;
tree = tree->rchild;
free(tmp);
}
else if (tree->rchild == NULL)
{
pbitree tmp = tree;
tree = tree->lchild;
free(tmp);
}
else
{
// 左子树最大节点替代当前节点
pbitree tmp = tree->lchild;
while (tmp->rchild != NULL)
{
tmp = tmp->rchild;
}
tree->data = tmp->data;
delete_bitree(tree->lchild,tmp->data);
}
}
}
int main()
{
pbitree tree = NULL;
srand(time(NULL));
int arr[10] = {22,32,13,64,43,56,23,66,2,31};
creat_bst(tree, arr, 10);// bst->binary search tree
in_order(tree);
delete_bitree(tree, 32);
in_order(tree);
return 0;
}
7681

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



