题目
今天分享一道力扣上的题
给定一个二叉搜索树 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
一、解题思路
一般遇到两数之和类型的题目,通常都会用到hash,记下标的用hashmap,单纯找是否存在的用hashset。
对于一个节点x的值,只需要我们检查哈希表中是否存在k-x即可。 如果可以找到,返回true,否则,把当前值添加到哈希表中。
如果遍历完整棵树都没有找到,即返回false
思路有了,接下来的问题就是如何去遍历了。
方法有很多种,比如前序后序中序层序都可以,选择多多,
这里展示深度优先和前序。
二、代码
1.前序遍历
Dqueu实现的是栈的先进后出
前序依次遍历存在(k-root.val)返回true;否则添加到hashset中。
public boolean findTarget(TreeNode root, int k) {
Set<Integer> s = new HashSet<>();
Deque<TreeNode> eq = new LinkedList<>();
while(!eq.isEmpty()||root!=null){
while(root!=null){
eq.push(root);
if(s.contains(k-root.val)){
return true;
}else{
s.add(root.val);
}
root=root.left;
}
root = eq.pop();
root =root.right;
}
return false;
}
2.深度优先
class Solution {
Set<Integer> s = new HashSet<>();
public boolean findTarget(TreeNode root, int k) {
if(root==null) return false;
if(s.contains(k-root.val)) return true;
else s.add(root.val);
return findTarget(root.left,k)||findTarget(root.right,k);
}
}
参考自:力扣官方解析
解析链接
侵删
说句题外话哈,
利用hash表元素不重复的特性
if(s.contains())替换成if(!s.add())也可以哦
不过在我在力扣测试中替换之后执行用时会慢一点
至于是什么原因,有兴趣的小伙伴可以去看看源码哈(看懂了教教我呗哈哈)