二叉搜索树面试题总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/hansionz/article/details/81985287