给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉搜索树中是否存在两个节点它们的值之和等于 k 。假设二叉搜索树中节点的值均唯一。
思路:先广度遍历一遍,把所有值存在set里,再遍历一遍看k-e.val在不在set里,即可保证a和b都在set里,并且a+b=k,但是忽略了一个条件:a!=b。即11+11=22这种是不行的
class Solution {
public boolean findTarget(TreeNode root, int k) {
if(root==null){
return false;
}
//先遍历一遍树,将所有的val存储在set里面,可以判断有没有
//广度优先遍历,用队列
Set<Integer> hashSet=new HashSet<Integer>();
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode e=queue.poll();
hashSet.add(e.val);
if(e.left!=null){
queue.add(e.left);
}
if(e.right!=null){
queue.add(e.right);
}
}
//再遍历一遍树,看有没有出现符合和的值
//继续广度优先遍历,再遍历一遍
boolean isOK=false;
queue.clear();
queue.add(root);
while(!queue.isEmpty()){
TreeNode e=queue.poll();
//注意这里:a!=b
if(hashSet.contains(k-e.val)&&(e.val!=k-e.val)){
//System.out.println((k-e.val)+" "+e.val);
isOK=true;
break;
}
if(e.left!=null){
queue.add(e.left);
}
if(e.right!=null){
queue.add(e.right);
}
}
return isOK;
}
}