题目:
思路:
法一:使用HashSet
代码
class Solution {
//使用Hashset
//如果存在两个元素之和为k=x+y,一个元素为x,只需判断是否含有y
//set中放节点的值 如果k-x在set中 返回true
//y不在set中,将该节点加入set,继续遍历他的左右子树
public boolean findTarget(TreeNode root, int k) {
Set<Integer> set=new HashSet<Integer>();
return find(root,set,k);
}
public boolean find (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 find(root.left,set,k)||find(root.right,set,k);
}
}
法二:中序遍历BST +双指针
class Solution {
//中序遍历
public boolean findTarget(TreeNode root, int k) {
List<Integer> list =new ArrayList();
inOrder(root,list);
int left=0,right=list.size()-1;
while(left<right){
int sum=list.get(left)+list.get(right);//List中的方法
if(sum==k) return true;
else if(sum<k) left++;
else right--;
}
return false;
}
public void inOrder(TreeNode root,List list ){
if(root==null) return ;
inOrder(root.left,list);
list.add(root.val);
inOrder(root.right,list);
}
}
相似题目1、167、170、653、15、18