Edge case:
need to determine whether two numbers come from same node.
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean findTarget(TreeNode root, int k) { if (root == null) { return false; } return inorderAndSearch(root, root, k); } private boolean inorderAndSearch(TreeNode current, TreeNode root, int target) { if (current == null) { return false; } return inorderAndSearch(current.left, root, target) || findValue(root, target - current.val, current) || inorderAndSearch(current.right, root, target); } private boolean findValue(TreeNode root, int value, TreeNode current) { if (root == null) { return false; } return (root != current && root.val == value) || findValue(root.left, value, current) || findValue(root.right, value, current); } }
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public boolean findTarget(TreeNode root, int k) { if (root == null) { return false; } List<Integer> nums = new ArrayList<>(); inorder(root, nums); int start = 0; int end = nums.size() - 1; while (start < end) { if (nums.get(start) + nums.get(end) == k) { return true; } else if (nums.get(start) + nums.get(end) > k) { end--;; } else { start++;; } } 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); } }