解法一:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//先中根遍历二分查找树,得到一个有序的序列,再来判断
private void recurse(TreeNode root, List<Integer> list){
if(root == null)
return;
recurse(root.left, list);
list.add(root.val);
recurse(root.right, list);
}
public boolean findTarget(TreeNode root, int k) {
List<Integer> list = new ArrayList<>();
recurse(root, list);
//System.out.println(list);
//用两个指针从首尾往中间移动,来判断是否有两个结点的和为k
int head = 0;
int tail = list.size() - 1;
while(head < tail){
int sum = list.get(head) + list.get(tail);
if(sum == k)
return true;
else if(sum < k)//说明sum小了,那么前面head指向的较小的数还要增大
head++;
else
tail--;
}
return false;
}
}