题目
给定一个二叉搜索树 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提示:
二叉树的节点个数的范围是 [1, 104].
-10^4 <= Node.val <= 10^4
root 为二叉搜索树
-10^5 <= k <= 10^5
思路
这个题无论如何都需要完整地遍历树的所有节点,所以其实是不是二叉搜索树其实没那么关键,直接或者
遍历,同别的两数之和一样,使用一个哈希表记录遍历过的值。没必要终须遍历完再双指针,还需要一个数组存下来结果,感觉很蠢,不好写的是中序遍历迭代加双指针,之后补上。
代码
class Solution {
public boolean findTarget(TreeNode root, int k) {
Set<Integer> set = new HashSet<>();
return dfs(root, set, k);
}
private boolean dfs(TreeNode root, Set<Integer> set, int k) {
if (root == null) {
return false;
}
if (set.contains(k - root.val)) {
return true;
}
set.add(root.val);
return dfs(root.left, set, k) || dfs(root.right, set, k);
}
}