本文最后更新于:2021年7月22日 晚上
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
例如,
| 给定二叉搜索树:
4 / \ 2 7 / \ 1 3
和值: 2
|
你应该返回如下子树:
在上述示例中,如果要找的值是 5
,但因为没有节点值为 5
,我们应该返回 NULL
。
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
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)
|
cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
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; } };
|
注:参考 代码随想录
在递归遍历的时候,什么时候直接return 递归函数的返回值,什么时候不用加这个 return呢?
「因为搜索到目标节点了,就要立即return了,这样才是找到节点就返回(搜索某一条边),如果不加return,就是遍历整棵树了。」
- 迭代法
- 因为二叉搜索树的特殊性,也就是节点的有序性,可以不使用辅助栈或者队列
「对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向。」
| 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; } };
|