【算法20天:Day20】第六章二叉树 LeetCode 二叉搜索树中的搜索(700)

66 阅读1分钟

题目三:

image.png

解法一:(递归)

解题思路:

二叉搜索树是一个有序树:

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树
  1. 确定递归函数的参数和返回值

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

var searchBST = function(root, val) {}
  1. 确定终止条件

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

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

看看二叉搜索树的单层递归逻辑有何不同。

因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。

如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。

TreeNode* result = NULL;
if (root.val > val) result = searchBST(root.left, val);
if (root.val < val) result = searchBST(root.right, val);
return result;

完整代码:

var searchBST = function(root, val) {
    let result = null
    if (root === null || root.val === val) return root
    if (root.val > val) {
        result = searchBST(root.left, val) 
    }
    if (root.val < val) {
        result = searchBST(root.right, val)
    }
    return result
};

解法二:(迭代法)

一提到二叉树遍历的迭代法,可能立刻想起使用栈来模拟深度遍历,使用队列来模拟广度遍历。

对于二叉搜索树可就不一样了,因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列就可以写出迭代法。

对于一般二叉树,递归过程中还有回溯的过程,例如走一个左方向的分支走到头了,那么要调头,再走右分支。

对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。

var searchBST = function(root, val) {
    while (root !== null) {
        if (root.val > val) {
            root = root.left
        } else if (root.val < val) {
            root = root.right
        } else {
            return root
        }
    }
    return null
};