题目描述:
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
案例 1:
输入:
5
/ \
3 6
/ \ \
2 4 7
Target = 9
输出: True
案例 2:
输入:
5
/ \
3 6
/ \ \
2 4 7
Target = 28
输出: False
思路:遍历二叉搜索树每一个结点(我的代码采用的是前序遍历),遍历每个结点时求出sum减去当前结点值的差,再用二叉搜索树的方式查找是否含有这个差,如果存在则返回true,否则返回false。注意:排除结点值是sum值一半的情况。
看了网上其他大神的代码:貌似也可以建一个哈希表。(下次尝试)
代码:
class Solution {
public:
bool findTarget(TreeNode* root, int k) {
if(root==NULL||(!root->left&&!root->right))return false;
int flag=0;
root=preorder(root,root,k,flag);
return flag;
}
TreeNode * preorder(TreeNode * cur,TreeNode *root,int k,int& flag){
if(cur==NULL)return NULL;
if(flag==1)return cur;
if(cur->val!=k-cur->val)//例如:搜索和为6,假如二叉树有3,搜索时搜索的是3(因为6-3=3),会出错,所以要排除这种情况
flag=search(root,k-cur->val);
cur->left=preorder(cur->left,root,k,flag);
cur->right=preorder(cur->right,root,k,flag);
return cur;
}
bool search(TreeNode * root,int k){
if(root==NULL)return false;
if(root->val==k)return true;
if(root->val<k)return search(root->right,k);
if(root->val>k)return search(root->left,k);
}
};