LeetCode 700. 二叉搜索树中的搜索
摘要
LeetCode 700 二叉搜索树中的搜索题解,使用递归利用 BST 左小右大的性质进行快速搜索,时间复杂度 O(h),空间复杂度 O(h)(h 为树高)。
标签
#算法 #LeetCode #二叉树 #二叉搜索树 #递归 #题解
目录
- 题目描述
- 易错点
- 思路
- 编写代码
1. 题目描述
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。
你需要在 BST 中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null。
示例 1:
text
输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]
示例 2:
text
输入:root = [4,2,7,1,3], val = 5
输出:[]
提示:
- 树中节点数在
[1, 5000]范围内 1 <= Node.val <= 10^7root是二叉搜索树1 <= val <= 10^7
2. 易错点
- 若根节点为空,直接返回
NULL。 - 若当前节点值等于目标值,直接返回当前节点(包括其整棵子树)。
- 根据 BST 性质,若目标值小于当前节点值,则搜索左子树;若大于当前节点值,则搜索右子树。
- 注意递归终止条件:找到目标节点或遇到空节点。
- 无需修改树结构,只需返回符合条件的子树根节点。
3. 思路
本题利用二叉搜索树(BST)的有序性质:左子树所有节点值小于根节点值,右子树所有节点值大于根节点值。
采用递归搜索:
- 若当前节点为空,说明未找到,返回
NULL。 - 若当前节点值等于目标值,返回当前节点(即找到目标子树)。
- 若目标值小于当前节点值,则在左子树中继续搜索。
- 若目标值大于当前节点值,则在右子树中继续搜索。
每次递归根据大小比较排除一半子树,搜索路径长度等于树高 h,时间复杂度 O(h)。空间复杂度 O(h) 为递归栈深度。
4. 编写代码
c 运行
c
struct TreeNode* searchBST(struct TreeNode* root, int val) {
if(!root) return NULL;
if(root->val == val) return root;
else if(root->val > val) return searchBST(root->left, val);
else return searchBST(root->right, val);
}