【每日算法】力扣700. 二叉搜索树中的搜索

115 阅读2分钟

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。

描述

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,

给定二叉搜索树:

    4
   / \
  2   7
 / \
1   3

和值: 2 你应该返回如下子树:

  2     
 / \   
1   3

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。

做题

题目给定的二叉搜索树是已经排好序的,比当前节点大的排在右,小的排在左。

这样我们只要判断当前的节点是否比目标值大还是小,大的走左边,小的走右边。

    4
   / \
  2   7
 / \
1   3

像这里,如果我们找 2,4 比 2 大,走左边;如果我们找7,4 比 7 小,走右边。

如果没有找到目标节点的话,就一直往下,这里就只有深度优先了,广度优先做不了这道题。

递归法

虽说这里是递归,但这里是二分递归,不会全部子节点都去递归。

public TreeNode searchBST(TreeNode root, int val) {
            if(root==null || root.val==val){
                return root;
            }
            if(root.val > val){
                return searchBST(root.left,val);
            }
            return searchBST(root.right,val);
    }

image.png

迭代法

这里的迭代法只是换了个做法,把下一个要遍历的节点放到变量 root 上。解题思路还是和递归法的一样,区别不大。

public TreeNode searchBST(TreeNode root, int val) {
            while(root!=null){
                if(root.val == val){
                    return root;
                }
                root = root.val > val ? root.left : root.right;
            }
            return null;
    }

image.png

但是内存消耗比递归的高多了,这就很奇怪。

最后

今天就到这里了。

这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。