解法一:使用HashSet,在中序遍历树的同时,判断是否在HashSet中已经存在一个值和当前根节点的值相加可以满足等于target。
c++版本:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool findTarget(TreeNode* root, int k) {
set<int> st;
return find(root, k, st);
}
bool find(TreeNode* root, int k, set<int>& st){
if(root==NULL){
return false;
}
auto it = st.find(k-root->val);
if(it!=st.end()){
return true;
}
st.insert(root->val);
return find(root->left, k, st) || find(root->right, k, st);
}
};
Java版本
/**
* 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();
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);
}
}
方法二:通过广度优先搜索来访问BST。与上一种方法的区别在于,遍历树的方式不同。
Java版本
/**
* 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.left);
queue.add(node.right);
}else{
queue.remove();
}
}
return false;
}
}
方法三:利用二叉查找树的性质(二叉查找树的中序遍历序列是一个单调不减序列),将二叉查找树的值通过中序遍历存入到数组中,然后通过双指针的方法寻找是否有满足条件的两个数。
时间复杂度为O(n),空间复杂度为O(n)
Java版本
/**
* 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) {
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);
}
}
C++ 版本
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool findTarget(TreeNode* root, int k) {
vector<int> vec;
inorder(root, vec);
if(vec.size()<2){
return false;
}
int i=0,j=vec.size()-1;
while(i<j){
if(vec[i]+vec[j]==k){
return true;
}
if(vec[i]+vec[j]<k){
i++;
}else{
j--;
}
}
return false;
}
void inorder(TreeNode* root, vector<int>& vec){
if(root==NULL){
return;
}
inorder(root->left, vec);
vec.push_back(root->val);
inorder(root->right, vec);
}
};