「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。
描述
给定一个二叉搜索树 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
示例 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);
}
}
广度优先/迭代法
迭代法和递归法的处理思路都是一样的,都是使用 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;
}
}
最后
今天就到这里了。
这里是程序员徐小白,【每日算法】是我新开的一个专栏,在这里主要记录我学习算法的日常,也希望我能够坚持每日学习算法,不知道这样的文章风格您是否喜欢,不要吝啬您免费的赞,您的点赞、收藏以及评论都是我下班后坚持更文的动力。