版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hansionz/article/details/81985287
0.什么是二叉搜索树
二叉搜索树就是左子树所有结点都小于根结点,右子树所有结点都打于根节点。当然这个定义递归的,它的左右子树也满足这个特点
例如:
0.定义结构
typedef int BSTDataType;
//定义二叉搜索树结点类型
typedef struct BSTreeNode
{
BSTDataType _data;
struct BSTreeNode* _left;
struct BSTreeNode* _right;
}BSTreeNode
1.向二叉搜索树中插入一个值
总结于我的另一篇博客:
https://blog.csdn.net/hansionz/article/details/81985624
2.二叉搜索树删除一个结点
总结于我的另一篇博客:
https://blog.csdn.net/hansionz/article/details/81988752
3.在二叉搜索树中查找一个结点
思路:根据二叉搜索树根节点大于左子树结点,但是小于右子树结点的特点,和给定值比较,如果根结点的值小于给定值,必然在右子树,然后在在右子树里继续比较查找;如果根结点的值大于给定值,必然在左子树中,然后在左子树里继续比较查找。
- 非递归
//查找一个结点
//根据二叉搜索树的特点,左树都小于根节点,右树都大于根节点的特点和已知值相比遍历二叉搜索树来查找
//这里直接给一级指针也可以,为了和上边操作统一才弄得二级指针
BSTreeNode* BSTreeFind(BSTreeNode** root, BSTDataType x)
{
assert(root);
BSTreeNode* cur = *root;
while (cur)
{
//x大于当前结点,必然在右树
if (cur->_data < x)
{
cur = cur->_right;
}
//x小于当前结点,必然在左树
else if (cur->_data>x)
{
cur = cur->_left;
}
else
{
//相等则返回它的指针
return cur;
}
}
//遍历结束则没有找到,返回NULL
return NULL;
}
- 递归
BSTreeNode* BSTreeFindR(BSTreeNode** root, BSTDataType x)
{
assert(root);
//根为空,直接返回NULL
if (*root == NULL)
{
return NULL;
}
//左子树查找
if ((*root)->_data > x)
{
BSTreeFindR(&(*root)->_left, x);
}
//右子树查找
else if ((*root)->_data < x)
{
BSTreeFindR(&(*root)->_right, x);
}
//相等则返回地址
else
{
return *root;
}
}
4.中序遍历二叉搜索树(遍历出来的序列递增,方便测试)
思路:递归遍历,先递归遍历左子树,在访问根结点,最后递归遍历右子树。当然也可以用非递归遍历,下边贴出二叉树的三种遍历方式(递归&非递归)的链接。
https://blog.csdn.net/hansionz/article/details/81910587
//中序遍历二叉搜索树(递归)
void BSTreeInOrder(BSTreeNode** root)
{
assert(root);
//根为空,直接返回
if ((*root) == NULL)
{
return;
}
//递归遍历左子树
BSTreeInOrder(&(*root)->_left);
//访问根结点
printf("%d ", (*root)->_data);
//递归遍历右子树
BSTreeInOrder(&(*root)->_right);
}
5.假设给你一篇英语文章,又给你一个在这个英语文章中的英语单词,让你检查这个英语单词是否拼写正确。(key模式)
总结于我的另一篇博客:
https://blog.csdn.net/hansionz/article/details/82052583
6.假设给你一篇英语文章,如何才能求出文章中所有单词重复出现的次数呢?(key-value模式)
总结于我的另一篇博客:
https://blog.csdn.net/hansionz/article/details/82052583