题目描述
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
案例 1:
输入:
5
/
3 6
/ \
2 4 7
Target = 9
输出: True
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum-iv-input-is-a-bst
解法
这道题思路比较简单,可以先通过遍历把二叉树中的值都存入数组中,再在数组中找是否有两数之和等于目标值。但是可以做一些优化。
1.遍历的方式:可以采用中序遍历,因为二叉树中中序遍历得到的结果是有序的,在查找两数之和的时候便于查找。
2.查找的方式:最普通的方式是逐个遍历,这样需要二重循环,时间复杂度比较大,由于我们是中序遍历得到的递增数组,完全可以用双指针,加快查找速度。和比目标值小,移动左指针;和比目标值大,移动右指针;和等于目标值,返回true。
代码如下:
/**
* 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;
inorder(root,res);
int left = 0;
int right = res.size()-1;
while(left<right)
{
int sum = res[left] + res[right];
if(sum == k) return true;
else if(sum < k) //和比目标值小,则移动左指针
left++;
else
right--; //和比目标值大,则移动右指针
}
return false;
}
void inorder(TreeNode *root,vector<int> &res)
{
if(root)
{
inorder(root->left,res);
res.push_back(root->val);
inorder(root->right,res);
}
}
};