Files
leetcode-master/problems/0700.二叉搜索树中的搜索.md
youngyangyang04 304e409f48 Update
2020-08-13 09:15:50 +08:00

3.7 KiB
Raw Blame History

题目地址

https://leetcode-cn.com/problems/search-in-a-binary-search-tree/

思路

递归法

先来看递归的实现方式。

依然从递归三要素开始分析:

  • 确定递归函数的参数和返回值
  • 确定终止条件
  • 确定单层递归的逻辑
  1. 确定递归函数的参数和返回值

递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。

代码如下:

TreeNode* searchBST(TreeNode* root, int val)
  1. 确定终止条件

如果root为空或者找到这个数值了就返回root节点。

if (root == NULL || root->val == val) return root;
  1. 确定单层递归的逻辑

来看一下二叉搜索树的单层递归逻辑有何不同, 因为二叉搜索树的节点是有序的所以可以有方向的去搜索如果root->val > val搜索左子树如果root->val < val就搜索右子树最后如果都没有搜索到就返回NULL。

代码如下:

if (root->val > val) return searchBST(root->left, val);
if (root->val < val) return searchBST(root->right, val);
return NULL;

这里可能会疑惑在递归遍历的时候什么时候直接return 递归函数的返回值,什么时候不用加这个 return 这取决于对递归函数的定义,这里定义的递归函数,就是返回 要查找的元素所在的节点而这个节点就是我们所求所以直接return递归函数的返回值。

整体代码如下:

TreeNode* searchBST(TreeNode* root, int val) {
    if (root == NULL || root->val == val) return root;
    if (root->val > val) return searchBST(root->left, val);
    if (root->val < val) return searchBST(root->right, val);
    return NULL;
}

迭代法

一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历,其实因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。

对于一般二叉树,模拟递归的过程中还有一个回溯的过程,例如走一个左方向的分支走到头了,那么要调头,在走右分支。而对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。

看如下图中的这颗二叉搜索树例如要搜索元素为3的节点我们不需要搜索其他节点也不需要做回溯查找的路径已经规划好了。 二叉搜索树

迭代法代码如下:

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        while (root != NULL) {
            if (root->val > val) root = root->left;
            else if (root->val < val) root = root->right;
            else return root;
        }
        return NULL;
    }
};

C++代码

递归

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == NULL || root->val == val) return root;
        if (root->val > val) return searchBST(root->left, val);
        if (root->val < val) return searchBST(root->right, val);
        return NULL;
    }
};

迭代

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        while (root != NULL) {
            if (root->val > val) root = root->left;
            else if (root->val < val) root = root->right;
            else return root;
        }
        return NULL;
    }
};

更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。