这是我参与11月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
目标:拼搏30天,拿到11月的Leetcode 月度勋章。今天是第 26 天。
700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
分析:
这是一道常见的面试题。可以说十分简单。 首先,我们需要了解二叉搜索树满足如下性质:
- 左子树所有节点的元素值均小于根的元素值;
- 右子树所有节点的元素值均大于根的元素值。
据此可以得到如下算法:
1. 方法1:递归方法
1.1 若 root 为空则返回空节点;
1.2 若 val=root.val,则返回 root;
1.3 若 val<root.val,递归左子树;
1.4 若 val>root.val,递归右子树。
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null) {
return null;
}
if (val == root.val) {
return root;
}
return searchBST(val < root.val ? root.left : root.right, val);
}
}
复制代码
- 时间复杂度:O(N),其中 N 是二叉搜索树的节点数。
- 空间复杂度:O(N)。
- 方法2:迭代方法
2.1 若 root 为空则跳出循环,并返回空节点;
2.2 若 val=root.val,则返回 root;
2.3 若 val<root.val,将 root 置为root.left;
2.4 若val>root.val,将 root 置为 root.right。
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while (root != null) {
if (val == root.val) {
return root;
}
root = val < root.val ? root.left : root.right;
}
return null;
}
}
复制代码
- 时间复杂度:O(N),其中 N 是二叉搜索树的节点数。
- 空间复杂度:O(1)。