二叉搜索树
学习时间2022.11.07
二叉搜索树
基本概念
二叉搜索树(又:二叉查找树,二叉排序树,Binary Search Tree,BST)是一种二叉树,其中每个结点最多有两个子结点且具有二叉搜索树性质:左子树上所有结点的值均小于它的根结点的值以及右子树上所有结点的值均大于它的根结点的值
BST可视化动画,可用于了解BST
代码实现
基本数据结构
//二叉搜索树的数据结构
typedef struct BSTNode {
KeyType key;
struct BSTNode* lchild;
struct BSTNode* rchild;
}BSTNode, * BiTree;
建立二叉搜索树
//将结点插入二叉树,小的插入左子树,大的插入右子树
bool BST_Insert(BiTree& T, KeyType k)
{
if (T == NULL)
{
T = (BSTNode*)calloc(1, sizeof(BSTNode));
T->key = k;
return true;
}
else if (T->key == k)
{
return false;
}
else if (T->key > k)
{
return BST_Insert(T->lchild, k);
}
else
{
return BST_Insert(T->rchild, k);
}
}
//创建二叉搜索树
void Create_BST(BiTree &T, KeyType str[], int num)
{
T = NULL;
int i = 0;
while (i < num)
{
BST_Insert(T, str[i]);
i++;
}
}
查找指定结点(包含递归和非递归实现)
//查找指定结点(递归实现)
BSTNode* BST_Search_Recursion(BiTree T, KeyType k, BiTree &parent)
{
if (T->key > k)
{
return BST_Search_Recursion(T->lchild, k, parent);
}
else if(T->key < k)
{
return BST_Search_Recursion(T->rchild, k, parent);
}
}
//查找指定结点(非递归实现)
BSTNode* BST_Search(BiTree T, KeyType k, BiTree& parent)
{
while (T && T->key != k)
{
if (T->key > k)
{
T = T->lchild;
parent = T;
}
else
{
T = T->rchild;
parent = T;
}
}
return T;
}
删除结点
这部分代码比较难理解,需要一步步调试来看。
//删除结点(王道代码)
/*选择被删除结点左子树里面最大的一个或者右子树里面最小的一个代替被删除结点的key值,此处使用的是左子树最大值*/
void Delete_Node_LeftMax(BiTree& T, KeyType k)
{
if (T == NULL)
{
return;
}
if (T->key > k)
{
Delete_Node_LeftMax(T->lchild, k);
}
else if (T->key < k)
{
Delete_Node_LeftMax(T->rchild, k);
}
else
{
if (T->lchild == NULL)
{
BiTree tempNode = T;
T = T->rchild;
free(tempNode);
}
else if (T->rchild == NULL)
{
BiTree tempNode = T;
T = T->lchild;
free(tempNode);
}
else
{
BiTree tempNode = T->lchild;
if (tempNode->lchild != NULL)
{
tempNode = tempNode->rchild;
}
T->key = tempNode->key;
Delete_Node_LeftMax(T->lchild, tempNode->key);
}
}
}
//此处使用的是右子树最小值
void Delete_Node_RightMin(BiTree& T, KeyType k)
{
if (T == NULL)
{
return;
}
else if (T->key > k)
{
Delete_Node_RightMin(T->lchild, k);
}
else if (T->key < k)
{
Delete_Node_RightMin(T->rchild, k);
}
else
{
if (T->lchild == NULL)
{
BiTree tempNode = T;
T = T->rchild;
free(tempNode);
}
else if (T->rchild == NULL)
{
BiTree tempNode = T;
T = T->lchild;
free(tempNode);
}
else
{
BiTree tempNode = T->rchild;
if (tempNode->lchild != NULL)
{
tempNode = tempNode->lchild;
}
T->key = tempNode->key;
Delete_Node_RightMin(T->rchild, tempNode->key);
}
}
}
main函数测试
int main()
{
BiTree T = NULL;
BSTNode* search;
BiTree parent;
KeyType str[] = { 40,20,50,30,60,45,80,10,55,44,46 };
Create_BST(T, str, 11);
InOrder(T);
search= BST_Search_Recursion(T, 80, parent);
printf("\n%3d", search->key);
search = BST_Search(T, 80, parent);
printf("\n%3d", search->key);
printf("\n%3d\n", T->key);
//Delete_Node_LeftMax(T, 50);
Delete_Node_RightMin(T, 50);
InOrder(T);
}