题目
给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
示例 1:
输入: root = [5,3,6,2,4,null,7], k = 9
输出: true
示例 2:
输入: root = [5,3,6,2,4,null,7], k = 28
输出: false
提示:
二叉树的节点个数的范围是 [1, 104].
-104 <= Node.val <= 104
root 为二叉搜索树
-105 <= k <= 105
题解
广度优先遍历+二叉搜索树
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool searchBST(TreeNode* root,int val,TreeNode* same)
{
if(root == nullptr)
return false;
if(root->val == val && root!=same)
return true;
return searchBST(val < root->val ? root->left : root->right,val,same);
}
bool findTarget(TreeNode* root, int k) {
queue<TreeNode*> myqueue;
myqueue.emplace(root);
while(!myqueue.empty())
{
TreeNode* node;
node = myqueue.front();
myqueue.pop();
if(searchBST(root,k - node->val,node))
return true;
if(node->left)
myqueue.emplace(node->left);
if(node->right)
myqueue.emplace(node->right);
}
return false;
}
};
广度优先遍历+哈希表
class Solution {
public:
bool findTarget(TreeNode* root, int k) {
queue<TreeNode*> myqueue;
myqueue.emplace(root);
TreeNode* node;
unordered_set<int> myset;
while(!myqueue.empty())
{
node = myqueue.front();
myqueue.pop();
if(myset.count(k - node->val))
return true;
myset.emplace(node->val);
if(node->left)
myqueue.emplace(node->left);
if(node->right)
myqueue.emplace(node->right);
}
return false;
}
};