LeetCode笔记:653. Two Sum IV - Inp
2018-02-05 本文已影响84人
Cloudox_
问题(Easy):
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.
Example 1:
Input:
Target = 9
Output: TrueExample 2:
Input:
Target = 28
Output: False
大意:
给出一个二叉搜索树和一个目标值,返回树中是否存在两个元素相加等于目标值。
例1:
输入:
目标值 = 9
输出:True例2:
输入:
目标值= 28
输出:False
思路:
目标是在树中找到两个数相加正好等于目标值,我们用广度优先遍历的方法遍历树,同时构建一个set集合,对于每一个元素,我们将其节点值与目标值的差值放入set中,这样,当遇到其他元素时,我们都在set中查找有没有其节点的值,如果有,说明另一个节点值曾经需要和它一起相加得出目标值,那就是True了,如果遍历完了还没这种情况,那就说明是False。
这种方法对所有树都适用,时间复杂度和空间复杂度都是O(n)。
代码(C++):
/**
* 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) return false;
set<int> partnerSet;
queue<TreeNode*> q;
q.push(root);
int levelNum = 1;
while (!q.empty()) {
int num = levelNum;
levelNum = 0;
for (int i = 0; i < num; i++) {
TreeNode* temp = q.front();
if (partnerSet.count(temp->val)) return true;
else {
partnerSet.insert(k - temp->val);
if (temp->left) {
q.push(temp->left);
levelNum++;
}
if (temp->right) {
q.push(temp->right);
levelNum++;
}
}
q.pop();
}
}
return false;
}
};
合集:https://github.com/Cloudox/LeetCode-Record