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
Analysis
https://leetcode.com/articles/two-sum-iv/
BFS + HashSet
广度优先搜索,level order traversal:每一个节点遍历时,在hashset里面找是否存在target - currentNode.val,每一层的左右子节点依次放入queue,同时在hashset里面存入当前遍历的节点:
Remove an element,pp, from the front of thequeuequeue.
Check if the elementk-pk−palready exists in thesetset. If so, return True.
Otherwise, add this element,ppto thesetset. Further, add the right and the left child nodes of the current node to the back of thequeuequeue.
Continue steps 1. to 3. till thequeuequeuebecomes empty.
Return false if thequeuequeuebecomes empty.
BST In-order Traversal + Two Pointers
先in-order遍历BST,输出到一个list,再对这个list用2 sum的方法找target即可,因为list排序过,因此用two pointers很方便。
Solution
BFS + HashSet - Time: O(n), Space O(n)
/**
* 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) {
Queue<TreeNode> queue = new LinkedList();
Set<Integer> set = new HashSet();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
if (set.contains(k - node.val)) {
return true;
}
set.add(node.val);
}
return false;
}
}
BST inorder + Two Pointers
public 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);
}
}
Recursive + HashSet
public 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);
}
}
Last updated
Was this helpful?