「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。
两数之和IV-输入BST
题目描述
给定一个二叉搜索树root和一个目标结果k,如果BST中存在两个元素且它们的和等于给定的目标结果,则返回true。
示例1:
输入:root=[5,3,6,2,4,null,7],k=9
输出:true
示例2:
输入:root=[5,3,6,2,4,null,7],k=28
输出:false
算法解析
该题解题方法使用的是BFS(广度优先算法)
使用方法搜索查找一对节点和为 k 的过程如下。首先维护一个set存储队列值,再将根节点加入 queue,然后执行以下步骤:
-
如果队列首部不为空,先取出首部的队列值p。
-
检查 set 中是否存在目标结果k - 队列值p。
如果存在,返回 true。
如果不存在,将队列值p放入set。
-
然后将当前节点的左孩子和右孩子加入到空队列queue。
-
当queue 不为空时,重复步骤1-3 。
-
如果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