700 二叉搜索树中的搜索

本文最后更新于:2021年7月22日 晚上

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,

1
2
3
4
5
6
7
8
9
给定二叉搜索树:

4
/ \
2 7
/ \
1 3

和值: 2

你应该返回如下子树:

1
2
3
  2     
/ \
1 3

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL

Solution

  • 利用 BST 的性质:左小右大
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# @lc code=start
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None

class Solution:
def searchBST(self, root: TreeNode, val: int) -> TreeNode:
if not root:
return
if root.val == val:
return root
elif root.val < val:
return self.searchBST(root.right, val)
else:
return self.searchBST(root.left, val)
# @lc code=end

cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// @lc code=start
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if (root == nullptr || root->val == val) return root;
if (root->val > val) return searchBST(root->left, val);
if (root->val < val) return searchBST(root->right, val);
return nullptr;
}
};
// @lc code=end

注:参考 代码随想录

在递归遍历的时候,什么时候直接return 递归函数的返回值,什么时候不用加这个 return呢?

「因为搜索到目标节点了,就要立即return了,这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。」

  • 迭代法
  • 因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列

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

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
while (root) {
if (root->val > val) root = root->left;
else if (root->val < val) root = root->right;
else
return root;
}
return nullptr;
}
};