文章目录
- 题目
- 标题和出处
- 难度
- 题目描述
- 要求
- 示例
- 数据范围
- 解法一
- 思路和算法
- 代码
- 复杂度分析
- 解法二
- 思路和算法
- 代码
- 复杂度分析
题目
标题和出处
标题:二叉搜索树中的搜索操作
出处:700. 二叉搜索树中的搜索操作
难度
2 级
题目描述
要求
给定二叉搜索树的根结点 root \texttt{root} root 和一个整数值 val \texttt{val} val。
在二叉搜索树中找到结点值等于 val \texttt{val} val 的结点并返回以该结点为根的子树。如果该结点不存在,返回 null \texttt{null} null。
示例
示例 1:
输入:
root
=
[4,2,7,1,3],
val
=
2
\texttt{root = [4,2,7,1,3], val = 2}
root = [4,2,7,1,3], val = 2
输出:
[2,1,3]
\texttt{[2,1,3]}
[2,1,3]
示例 2:
输入:
root
=
[4,2,7,1,3],
val
=
5
\texttt{root = [4,2,7,1,3], val = 5}
root = [4,2,7,1,3], val = 5
输出:
[]
\texttt{[]}
[]
数据范围
- 树中结点数目在范围 [1, 5000] \texttt{[1, 5000]} [1, 5000] 内
- 1 ≤ Node.val ≤ 10 7 \texttt{1} \le \texttt{Node.val} \le \texttt{10}^\texttt{7} 1≤Node.val≤107
- root \texttt{root} root 是二叉搜索树
- 1 ≤ val ≤ 10 7 \texttt{1} \le \texttt{val} \le \texttt{10}^\texttt{7} 1≤val≤107
解法一
思路和算法
根据二叉搜索树的性质,空二叉树是二叉搜索树,对于非空二叉搜索树,根结点的左子树中的每一个结点的值都小于根结点的值,根结点的右子树中的每一个结点的值都大于根结点的值,且根结点的左子树和右子树也是二叉搜索树。
首先比较根结点值和目标值。如果根结点值和目标值相等,则根结点即为目标结点,将根结点返回。如果根结点值和目标值不相等,执行如下操作。
-
如果根结点值大于目标值,则只有根结点的左子树中可能存在目标值,因此在根结点的左子树中搜索。
-
如果根结点值小于目标值,则只有根结点的右子树中可能存在目标值,因此在根结点的右子树中搜索。
搜索过程中,如果当前子树为空,则一定不存在结点值等于目标值的结点,此时返回空树。
上述过程是一个递归的过程。递归的终止条件是当前结点为空或者当前结点值等于目标值,此时返回当前结点。对于其余情况,定位到可能存在目标值的子树,对该子树调用递归。
代码
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || root.val == val) {
return root;
}
return root.val > val ? searchBST(root.left, val) : searchBST(root.right, val);
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。时间复杂度取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)。
-
空间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。空间复杂度主要是递归调用的栈空间,取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)。
解法二
思路和算法
递归实现可以改成迭代实现。从根结点开始搜索,如果当前结点不为空且当前结点值和目标值不相等,则执行如下操作,直到当前结点为空或者当前结点值和目标值相等。
-
如果当前结点值大于目标值,则只有当前结点的左子树中可能存在目标值,因此将当前结点移动到左子结点。
-
如果当前结点值小于目标值,则只有当前结点的右子树中可能存在目标值,因此将当前结点移动到右子结点。
搜索结束时,如果目标结点存在,则当前结点为目标结点,否则当前结点为空结点。因此当搜索结束时,返回当前结点。
代码
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
TreeNode node = root;
while (node != null && node.val != val) {
if (node.val > val) {
node = node.left;
} else {
node = node.right;
}
}
return node;
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n),其中 n n n 是二叉搜索树的结点数。时间复杂度取决于二叉搜索树的高度,最坏情况下二叉搜索树的高度是 O ( n ) O(n) O(n)。
-
空间复杂度: O ( 1 ) O(1) O(1)。