开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
LeetCode 653. Two Sum IV - Input is a BST
给定一个二叉搜索树 root 和一个目标结果 k,如果二叉搜索树中存在两个元素且它们的和等于给定的目标结果,则返回 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
思路
根据题目要求,要注意是两个元素的和构成目标数,不可以是一个元素自己等于目标数,或者一个元素自己加自己等于目标数。
方法1 暴力求解
遍历树,对于每个子节点检查是否有另一个节点跟它的和为目标数。
复杂度分析 时间复杂度 O(n2)O(n2) 空间复杂度 O(1)O(1) 因为对于每个节点都要遍历一次树,所以时间复杂度比较高。
class Solution {
public:
bool searchBST(TreeNode* root, TreeNode* cur, int k) {
if (cur == NULL)
return false;
TreeNode*p=root;
while(p!=NULL)
{
if (k == 2 * cur->val)
break;
if (k == cur->val + p->val) {
return true;
}
if (k > cur->val + p->val)
p = p->right;
else if (k < cur->val + p->val)
p = p->left;
}
return (searchBST(root, cur->left, k) || searchBST(root, cur->right, k));
}
bool findTarget(TreeNode* root, int k) {
return searchBST(root,root,k);
}
};
算法2 利用BST树排序节点
首先将所有节点顺序取出来,将排序好的二叉树变成一个线性的排好序的队列,然后从数组两端向中间寻找可以满足条件的搭配。
复杂度分析 最坏情况相当于将所有节点遍历了两次,因此是O(n)的复杂度。
时间复杂度 O(n)O(n) 空间复杂度 O(n)O(n)
C++ 代码
class Solution {
public:
vector<int> treeNode;
void InOrder(TreeNode*root)
{
if(root==NULL)
return;
InOrder(root->left);
treeNode.push_back(root->val);
InOrder(root->right);
}
bool findTarget(TreeNode* root, int k) {
InOrder(root);
int l=0;
int r=treeNode.size()-1;
while(l!=r)
{
int sum=treeNode[l]+treeNode[r];
if(sum==k)
return true;
else if(sum>k)
r--;
else if(sum<k)
l++;
}
return false;
}
};