题目

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

提示:

二叉树的节点个数的范围是 [1, 104].
-10^4 <= Node.val <= 10^4
root 为二叉搜索树
-10^5 <= k <= 10^5

思路

这个题无论如何都需要完整地遍历树的所有节点,所以其实是不是二叉搜索树其实没那么关键,直接653. 两数之和 IV - 输入 BST - 图3或者653. 两数之和 IV - 输入 BST - 图4遍历,同别的两数之和一样,使用一个哈希表记录遍历过的值。没必要终须遍历完再双指针,还需要一个数组存下来结果,感觉很蠢,不好写的是中序遍历迭代加双指针,之后补上。

代码

  1. class Solution {
  2. public boolean findTarget(TreeNode root, int k) {
  3. Set<Integer> set = new HashSet<>();
  4. return dfs(root, set, k);
  5. }
  6. private boolean dfs(TreeNode root, Set<Integer> set, int k) {
  7. if (root == null) {
  8. return false;
  9. }
  10. if (set.contains(k - root.val)) {
  11. return true;
  12. }
  13. set.add(root.val);
  14. return dfs(root.left, set, k) || dfs(root.right, set, k);
  15. }
  16. }