📜  门| GATE-CS-2016(套装2)|第 44 题(1)

📅  最后修改于: 2023-12-03 15:12:43.488000             🧑  作者: Mango

GATE-CS-2016(套装2)第44题

题目描述

给定一棵二叉查找树和一个目标值,编写一个函数来搜索目标值在树中是否存在。如果存在,返回 true;否则,返回 false。

函数原型
public boolean searchBST(TreeNode root, int val) {
    
}
示例
示例1
输入:
    4
   / \
  2   7
 / \
1   3

val = 2
输出: true
示例2
输入:
    4
   / \
  2   7
 / \
1   3

val = 5
输出: false
解法

题目要求搜索二叉查找树(BST)中是否存在目标值。由于二叉查找树是具有特殊性质的二叉树,根据其特性,我们可以采用递归或迭代的方法进行搜索。

方法一:递归

假设当前搜索的节点为root,目标值为val:

  1. 如果root为null,返回false;
  2. 如果root的值等于val,返回true;
  3. 如果root的值大于val,递归搜索其左子树;
  4. 如果root的值小于val,递归搜索其右子树;
  5. 如果左右子树都没有找到val,返回false。
public boolean searchBST(TreeNode root, int val) {
    if (root == null) {
        return false;
    } else if (root.val == val) {
        return true;
    } else if (root.val > val) {
        return searchBST(root.left, val);
    } else {
        return searchBST(root.right, val);
    }
}
方法二:迭代

假设当前搜索的节点为cur,目标值为val:

  1. 如果cur为null,返回false;
  2. 如果cur的值等于val,返回true;
  3. 如果cur的值大于val,将cur更新为其左子树;
  4. 如果cur的值小于val,将cur更新为其右子树;
  5. 重复步骤2-4,直到cur为null或者找到目标值val。
public boolean searchBST(TreeNode root, int val) {
    TreeNode cur = root;
    while (cur != null) {
        if (cur.val == val) {
            return true;
        } else if (cur.val > val) {
            cur = cur.left;
        } else {
            cur = cur.right;
        }
    }
    return false;
}
算法分析

二叉查找树的特性决定了此题可以采用递归或迭代的方法进行搜索。因此,时间复杂度为O(h),其中h为二叉查找树的高度。如果树是平衡的,则时间复杂度为O(log n),其中n是树中节点的总数。如果树是不平衡的,则时间复杂度为O(n),其中n是树中节点的总数。空间复杂度为O(h),其中h为递归栈的最大深度。

总结

此题考查对二叉查找树的理解和掌握,需要掌握二叉查找树的特性和递归/迭代的搜索方法。此外,需要注意搜索的细节和边界条件,如树为空、根节点为空等情况。题目的解法不唯一,可以用二叉查找树的中序遍历进行深入剖析和理解。

参考