LeetCode 700. 二叉搜索树中的搜索

2 阅读2分钟

LeetCode 700. 二叉搜索树中的搜索

摘要

LeetCode 700 二叉搜索树中的搜索题解,使用递归利用 BST 左小右大的性质进行快速搜索,时间复杂度 O(h),空间复杂度 O(h)(h 为树高)。

标签

#算法 #LeetCode #二叉树 #二叉搜索树 #递归 #题解

目录

  1. 题目描述
  2. 易错点
  3. 思路
  4. 编写代码

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^7
  • root 是二叉搜索树
  • 1 <= val <= 10^7

2. 易错点

  1. 若根节点为空,直接返回 NULL
  2. 若当前节点值等于目标值,直接返回当前节点(包括其整棵子树)。
  3. 根据 BST 性质,若目标值小于当前节点值,则搜索左子树;若大于当前节点值,则搜索右子树。
  4. 注意递归终止条件:找到目标节点或遇到空节点。
  5. 无需修改树结构,只需返回符合条件的子树根节点。

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);
}