文章目录
- 题目
 - 标题和出处
 - 难度
 - 题目描述
 - 要求
 - 示例
 - 数据范围
 
- 解法一
 - 思路和算法
 - 代码
 - 复杂度分析
 
- 解法二
 - 思路和算法
 - 代码
 - 复杂度分析
 
题目
标题和出处
标题:二叉搜索树中的搜索操作
出处: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)。
 



















