653. Two Sum IV - Input is a BST
三种方法:
1.
/**
* 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) {
unordered_set<int> hasSeen;
return dfs(root, k, hasSeen);
}
private:
bool dfs(TreeNode* node, int k, unordered_set<int>& hasSeen) {
if (!node)
return false;
if (dfs(node->left, k, hasSeen))
return true;
if (hasSeen.find(k - node->val) != hasSeen.end())
return true;
hasSeen.insert(node->val);
return dfs(node->right, k, hasSeen);
}
};
这里自己写错了,不需要中序的,任意二叉树都可以用这种方法的。
/**
* 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> nums;
storeNum(root, nums);
int i = 0, j = nums.size()-1;
int sum = 0;
while (i < j) {
sum = nums[i] + nums[j];
if (sum < k)
++i;
else if (sum > k)
--j;
else
return true;
}
return false;
}
private:
void storeNum(TreeNode* node, vector<int>& nums) {
if (!node)
return;
storeNum(node->left, nums);
nums.push_back(node->val);
storeNum(node->right, nums);
}
};
/**
* 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) {
return helper(root, root, k);
}
private:
bool helper(TreeNode* node, TreeNode* root, int k) {
if (!node)
return false;
int v = node->val;
if (k - v != v) {
if (findHelper(root, k-v))
return true;
}
return helper(node->left, root, k) || helper(node->right, root, k);
}
bool findHelper(TreeNode* node, int target) {
if (!node)
return false;
if (node->val > target)
return findHelper(node->left, target);
else if (node->val < target)
return findHelper(node->right, target);
else
return true;
}
};