题目
解析
二叉搜索树特性
二叉搜索树是一棵二叉树,每个节点都有以下特性:
- 大于左子树上任意一个节点的值,
- 小于右子树上任意一个节点的值。
一个二叉搜索树的例子:
二叉搜索树中复杂度为对数时间的操作:
- 查找。
- 插入。
- 删除。
方法一:递归
算法
递归实现非常简单:
- 如果根节点为空
root == null
或者根节点的值等于搜索值val == root.val
,返回根节点。 - 如果
val < root.val
,进入根节点的左子树查找searchBST(root.left, val)
。 - 如果
val > root.val
,进入根节点的右子树查找searchBST(root.right, val)
。 - 返回根节点。
代码:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if (root == null || val == root.val) return root;
return val < root.val ? searchBST(root.left, val) : searchBST(root.right, val);
}
}
复杂度分析
方法二:迭代
为了降低空间复杂度,将递归转换为迭代:
- 如果根节点不空
root != null
且根节点不是目的节点val != root.val
:- 如果
val < root.val
,进入根节点的左子树查找root = root.left
。 - 如果
val > root.val
,进入根节点的右子树查找root = root.right
。
- 如果
- 返回
root
。
代码:
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while (root != null && val != root.val)
root = val < root.val ? root.left : root.right;
return root;
}
}