问题:
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
解决:
① 中序遍历二叉搜索树可以得到一个递增数组,只要查找该数组中是否包含两个数之和为target。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution { // 33ms
public boolean findTarget(TreeNode root, int k) {
if(root == null) return false;
List<Integer> list = new ArrayList<>();
inorder(root,list);
int head = 0;
int tail = list.size() - 1;
while(head < tail){
if(list.get(head) + list.get(tail) == k){
return true;
}else if(list.get(head) + list.get(tail) < k){
head ++;
}else{
tail --;
}
}
return false;
}
public void inorder(TreeNode node,List<Integer> list){
if(node == null) return;
inorder(node.left,list);
list.add(node.val);
inorder(node.right,list);
}
}
② 先序遍历二叉搜索树,根据遍历到的节点再查找target- node.val即可。
public class Solution { //23ms
public boolean findTarget(TreeNode root, int k) {
return helper(root, root, k);
}
public boolean helper(TreeNode root, TreeNode curNode, int k) {
if (curNode == null) return false;
return preorder(root, curNode, k - curNode.val) || helper(root, curNode.left, k) || helper(root, curNode.right, k);
}
public boolean preorder(TreeNode root, TreeNode curNode, int k) {
if (root == null) return false;
if (root != curNode && root.val == k) return true;
return (root.val < k) ? preorder(root.right, curNode, k) : preorder(root.left, curNode, k);
}
}