问题:
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 7Target = 9Output: True
Example 2:
Input: 5 / \ 3 6 / \ \2 4 7Target = 28Output: 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); } }