二叉搜索树操作题目:二叉搜索树中的搜索操作

题目

标题和出处

标题:二叉搜索树中的搜索操作

出处:700. 二叉搜索树中的搜索操作

难度

2 级

题目描述

要求

给定二叉搜索树的根结点 root \texttt{root} root 和一个整数值 val \texttt{val} val

在二叉搜索树中找到结点值等于 val \texttt{val} val 的结点并返回以该结点为根的子树。如果该结点不存在,返回 null \texttt{null} null

示例

示例 1:

示例 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:

示例 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} 1Node.val107
  • root \texttt{root} root 是二叉搜索树
  • 1 ≤ val ≤ 10 7 \texttt{1} \le \texttt{val} \le \texttt{10}^\texttt{7} 1val107

解法一

思路和算法

根据二叉搜索树的性质,空二叉树是二叉搜索树,对于非空二叉搜索树,根结点的左子树中的每一个结点的值都小于根结点的值,根结点的右子树中的每一个结点的值都大于根结点的值,且根结点的左子树和右子树也是二叉搜索树。

首先比较根结点值和目标值。如果根结点值和目标值相等,则根结点即为目标结点,将根结点返回。如果根结点值和目标值不相等,执行如下操作。

  • 如果根结点值大于目标值,则只有根结点的左子树中可能存在目标值,因此在根结点的左子树中搜索。

  • 如果根结点值小于目标值,则只有根结点的右子树中可能存在目标值,因此在根结点的右子树中搜索。

搜索过程中,如果当前子树为空,则一定不存在结点值等于目标值的结点,此时返回空树。

上述过程是一个递归的过程。递归的终止条件是当前结点为空或者当前结点值等于目标值,此时返回当前结点。对于其余情况,定位到可能存在目标值的子树,对该子树调用递归。

代码

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)

  • 28
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟大的车尔尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值