问题描述:
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.
示例:
Input: 5 / \ 3 6 / \ \ 2 4 7 Target = 9 Output: True
Input: 5 / \ 3 6 / \ \ 2 4 7 Target = 28 Output: False
问题分析:
我们考虑现将BST保存到数组res中,使得res是升序数组。这就变成了数组中的两数之和问题。
过程详见代码:
/**
* 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> res;
bl(root, res);
for (int i = 0; i < res.size() && res[i] <= k / 2; i++)
{
if (bs(res, k - res[i], i + 1, res.size() - 1))
return true;
}
return false;
}
bool bs(vector<int> res, int k, int left,int right)
{
int mid;
while (left < right)
{
mid = (left + right) / 2;
if (res[mid] == k) return true;
else if (res[mid] < k) left = mid + 1;
else right = mid;
}
return res[left] == k;
}
void bl(TreeNode* root,vector<int> & res)
{
if (root == NULL) return;
bl(root->left, res);
res.emplace_back(root->val);
bl(root->right, res);
}
};