【每日算法】力扣653. 两数之和 IV - 输入 BST

147 阅读2分钟

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

描述

给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true

示例 1:

image.png

输入: root = [5,3,6,2,4,null,7], k = 9

输出: true

示例 2:

image.png

输入: root = [5,3,6,2,4,null,7], k = 28

输出: false

示例 3:

输入: root = [2,1,3], k = 4

输出: true

示例 4:

输入: root = [2,1,3], k = 1

输出: false

示例 5

输入: root = [2,1,3], k = 3

输出: true

做题

深度优先/递归法

使用递归遍历 BST,在 set 中查看是否包含每个节点的 val,如果包含就说明存在两个元素且它们的和等于给定的目标结果,返回 true。

如果不包含,就继续递归遍历。


class Solution {
    public boolean findTarget(TreeNode root, int k) {
        Set set = new HashSet();
        return doFindeTarget(root,k,set);
    }

    public boolean doFindeTarget(TreeNode root, int k,Set set){
        if(root == null){
            return false;
        }
        if(set.contains(root.val)){
            return true;
        }
        set.add(k - root.val);
        return doFindeTarget(root.left,k,set) || doFindeTarget(root.right,k,set);
    }
}

image.png

广度优先/迭代法

迭代法和递归法的处理思路都是一样的,都是使用 Set 和遍历来找出是否有两个元素且它们的和等于给定的目标结果。

迭代法使用 Queue 来实现了广度优先的遍历操作,递归法使用了递归来实现深度优先的遍历操作。


class Solution {
    public boolean findTarget(TreeNode root, int k) {
        Set<Integer> set = new HashSet();
        Queue<TreeNode> queue = new LinkedList();
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(set.contains(node.val)){
                return true;
            }
            set.add(k-node.val);
            if(node.left != null){
                queue.offer(node.left);
            }
            if(node.right != null){
                queue.offer(node.right);
            }
        }
        return false;
    }
}

image.png

最后

今天就到这里了。

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