653. 两数之和 IV - 输入 BST
1.题目描述
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
案例 1:
案例 2:
2.方法1 (中序遍历+二分查找)
中序遍历是递增序列,在序列中二分查找,这种两个下标left和right,分别指向序列的头和尾,如果list[left] + list[right] < target则left++,如果list[left] + list[right] > target则right–,相等返回true。
3.代码
/**
* 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;
}
vector<int> vec;
inorder(root,vec);
int left = 0,right = vec.size() - 1;
while(left < right){
int sum = vec[left] + vec[right];
if(sum == k){
return true;
}
else if(sum < k){
left++;
}
else{
right--;
}
}
return false;
}
void inorder(TreeNode* root, vector<int>& vec){
if(root == NULL){
return;
}
inorder(root->left,vec);
vec.push_back(root->val);
inorder(root->right,vec);
}
};
4.复杂度分析
时间复杂度:O(N)
空间复杂度:O(N)
5.方法2(dfs + set)
深度优先遍历二叉树,把节点的值保存到set中,每遍历一个节点就判断当前k - 当前节点的值是否在set中
6.代码:
/**
* 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) {
set<int> s;
return find(root,k,s);
}
bool find(TreeNode* root,int k,set<int>& s){
if(root == NULL){
return false;
}
if(s.find(k - root->val) != s.end()){
return true;
}
s.insert(root->val);
return find(root->left,k,s) || find(root->right,k,s);
}
};
7.复杂度分析
时间复杂度:O(N)
空间复杂度:O(N)
9.方法3(bfs+set)
宽度优先遍历二叉搜索树,判断set中是否存在k-node->val,存在则返回true,否则把node->val插入set中,如果node的左右子节点不为空,则依次插入队列中。
10.代码
/**
* 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;
}
queue<TreeNode*> q;
set<int> s;
q.push(root);
while(!q.empty()){
TreeNode* node = q.front();
q.pop();
if(s.find(k - node->val) != s.end()){
return true;
}
s.insert(node->val);
if(node->left){
q.push(node->left);
}
if(node->right){
q.push(node->right);
}
}
return false;
}
};
11.复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)