原题:#653_两数之和Ⅳ-输入BST
- 解法一:
- 每遍历一个值,都将之与HashSet中的值进行比较
- 若符合x+y=k,则返回true
- 若不符合,则将之存入hashset中,然后去它的左子树和右子树中找
public boolean findTarget(TreeNode root, int k) {
Set<Integer> set = new HashSet();
return helper(root, k, set);
}
public boolean helper(TreeNode root, int k, Set<Integer> set) {
if (root == null) {
return false;
}
if (set.contains(k-root.val)) {
return true;
}
set.add(root.val);
return helper(root.left, k, set) || helper(root.right, k, set);
}
- 解法二:
- 先用中序遍历递归整棵树,把节点放到一个数组中
- 再用双指针,分别从头、尾往中间走
- 若两指针所指的值之和等于目标值,则返回true
- 若两只指针所指的值之和大于目标值,则尾指针往回走一步
- 若两只指针所指的值之和小于目标值,则首指针往前走一步
public boolean findTarget(TreeNode root, int k) {
List<Integer> nums = new ArrayList<>();
inOrder(root, nums);
int i = 0, j = nums.size() - 1;
while (i < j) {
int sum = nums.get(i) + nums.get(j);
if (sum == k) return true;
if (sum < k) i++;
else j--;
}
return false;
}
private void inOrder(TreeNode root, List<Integer> nums) {
if (root == null) return;
inOrder(root.left, nums);
nums.add(root.val);
inOrder(root.right, nums);
}