题目描述:
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
案例 1:
输入:
Target = 9
输出: True
案例 2:
输入:
Target = 28
输出: False
方法1:使用先序遍历的递归
主要思路:
(1)使用先序遍历,查看每一个结点处的值;
(2)使用unordered_set存储之前遍历过的每个结点处的值,然后使用目标值减去当前结点的值,获得的差,查看该差值是否在unordered_set 中存在,若存在, 则返回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 pre_serarch(TreeNode* root,const int& k,unordered_set<int>& mp){
//递归的一般终止条件
if(root==NULL)
return false;
//判断是否存在两个值之和等于目标值,既是否之前有个值和当前结点值之和为目标值
if(mp.count(k-root->val))
return true;
mp.insert(root->val);//将当前结点的值插入到unordered_set中
//接着向下递归
return pre_serarch(root->left,k,mp)||pre_serarch(root->right,k,mp);
}
bool findTarget(TreeNode* root, int k) {
//判断特殊情形
if(root==NULL||(root->left==NULL&&root->right==NULL))
return false;
unordered_set<int> mp;//存储之前出现过的结点值
return pre_serarch(root,k,mp);
}
};
方法2:使用迭代的先序遍历
主要思路:
(1)使用stack实现迭代的先序遍历;
/**
* 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) {
if(root==NULL||(root->left==NULL&&root->right==NULL))
return false;
unordered_set<int> mp;
stack<TreeNode*> st;
st.push(root);
TreeNode* tmp=NULL;
while(!st.empty()){
tmp=st.top();
st.pop();
if(mp.count(k-tmp->val))
return true;
mp.insert(tmp->val);
if(tmp->right)
st.push(tmp->right);
if(tmp->left)
st.push(tmp->left);
}
return false;
}
};