【力扣】两数之和IV-输入BST

172 阅读2分钟

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

两数之和IV-输入BST

题目描述

给定一个二叉搜索树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

算法解析

该题解题方法使用的是BFS(广度优先算法)

使用方法搜索查找一对节点和为 k 的过程如下。首先维护一个set存储队列值,再将根节点加入 queue,然后执行以下步骤:

  1. 如果队列首部不为空,先取出首部的队列值p。

  2. 检查 set 中是否存在目标结果k - 队列值p。

    如果存在,返回 true。

    如果不存在,将队列值p放入set。

  3. 然后将当前节点的左孩子和右孩子加入到空队列queue。

  4. 当queue 不为空时,重复步骤1-3 。

  5. 如果1-4循环结束,queue 还空,则返回false。

代码

public class Solution {
        public boolean findTarget(TreeNode root, int k) {
            //设置一个空set
            Set<Integer> set = new HashSet();
            //设置一个空队列
            Queue<TreeNode> queue = new LinkedList();
            //将树添加到队列中
            queue.add(root);
            //如果queue不为空
            while (!queue.isEmpty()) {
                //如果队列首部不为空
                if (queue.peek() != null) {
                    //从队列首部删除一个元素 p
                    TreeNode node = queue.remove();
                    //检查 set 中是否存在 k-p。如果存在,返回 True。
                    if (set.contains(k - node.val)){
                        return true;
                    }
                    //否则,将 p 加入 set。然后将当前节点的左孩子和右孩子加入 queue。
                    set.add(node.val);
                    queue.add(node.right);
                    queue.add(node.left);
                } else
                    queue.remove();
            }
            //如果queue为空,返回 False
            return false;
        }
    }

在这里我们附加一道代码测试题
写出下面这段代码的运行结果:

public class staticTest {
    public static void main(String[] args){
        int count=0;
        int num=0;
        for(int i=0;i<=100;i++){
            num=num+i;
            count=count++;
        }
        System.out.println("num*count="+(num*count));
    }
}

运行结果:num*count=0
原因:count=count++中count++是先赋值,再执行加1操作,count一直为0