# 题目:给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
解法1,排序树的中序遍历生成有序序列,然后用双指针法
分析:中序搜索二叉排序树,生成有序序列保存至vector中,然后利用之前的双指针法来求解即可
bool findTarget(TreeNode* root, int k) {
vector<int> vec;
inorder(root,vec);
int low=0,high=vec.size()-1;
while(low<high){
int sum = vec[low] + vec[high];
if(sum == k)
return true;
else if(sum < k)
low++;
else
high--;
}
return false;
}
void inorder(TreeNode* root,vector<int>& vec){
if(root != nullptr){
inorder(root->left,vec);
vec.push_back(root->val);
inorder(root->right,vec);
}
}
复杂度分析:
- 时间复杂度:生成vector用了O(n),然后查找也是O(n),取最大,因此时间复杂度应该是O(n)。
- 空间复杂度:利用了vector保存了n个结点,因此空间复杂度是O(n)
解法2:二叉树排序树的查找+前序遍历二叉树
分析:利用二叉排序树的查找算法,每次从根结点进行查找,然后利用前序遍历可以遍历到二叉树的每个结点,计算得到应该查找的值是多大,然后从根结点进行查找,并且判断查找所得结点不是nullptr且不是本身,那么算是查找成功
bool findTarget(TreeNode* root,TreeNode* node,int k) {
//利用递归遍历整棵树,再进行查找差值结点
if(root!=nullptr){
auto need = k - root->val;
auto foundNode = search(root,need);
if(foundNode!=nullptr && foundNode!=node)
return true;
else
return findTarget(root,node->left,k) || findTarget(root,node->right,k);
}else{
return false;
}
}
//在二叉搜索树上进行查找
TreeNode* search(TreeNode* root,int k){
if(root==nullptr)return nullptr;
else if(root->val == k)return root;
else if(root->val < k)return search(root->right,k);
else return search(root->left,k);
}
复杂度分析:
- 时间复杂度:遍历二叉树为O(n),平均查找为O(logn),最坏查找为O(n^2),因此时间复杂度为O(nlogn)。
- 空间复杂度:用了有限的变量,因此空间复杂度为O(1)。