653. Two Sum IV - Input is a BST
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST such that their sum is equal to the given target.
Example 1:
Input: 5 / \ 3 6 / \ \ 2 4 7 Target = 9 Output: True
Example 2:
Input: 5 / \ 3 6 / \ \ 2 4 7 Target = 28 Output: False
思路:
下面有三种解法:
其中第一种和第二种都是在遍历的过程中来将二叉树的节点存入 set 中,一边遍历一边来寻找符合条件的节点(k-root.val 和 root.val)。使用 set 类可以直接使用contains方法。
- 其中第一种是BFS和非递归方法实现的
- 第二种是直接遍历和递归方法实现的
第三种方法:先使用中序遍历,得到一个升序排列的list,再while寻找满足条件的节点。
不过没想到第一种是最慢的。。。
第一种方法:
/**
* 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){
Set<Integer> set =new HashSet();
Queue<TreeNode> queue = new LinkedList();
queue.add(root);
while(!queue.isEmpty()){
if(queue.peek()!=null){
TreeNode node = queue.remove();
if(set.contains(k-node.val)) return true;
set.add(node.val);
queue.add(node.right);
queue.add(node.left);
}else queue.remove();
}
return false;
}
}
Runtime:
34 ms
第二种方法:
class Solution {
public boolean findTarget(TreeNode root,int k){
Set<Integer> set =new HashSet();
return find(root,k,set);
}
public boolean find(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 find(root.left,k,set)||find(root.right,k,set);
}
}
Runtime: 29 ms
第三种方法:
class Solution {
public boolean findTarget(TreeNode root,int k){
List<Integer> list = new ArrayList();
inorder(root,list);
int l =0,r = list.size()-1;
while(l<r){
int sum = list.get(l) + list.get(r);
if(sum == k) return true;
if(sum <k) l++;
else r--;
}
return false;
}
public void inorder(TreeNode root,List<Integer> list){
if(root == null) return ;
inorder(root.left,list);
list.add(root.val);
inorder(root.right,list);
}
}
Runtime:
29 ms