653. Two Sum IV - Input is a BST

653. 两数之和 IV - 输入 BST

给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。

案例 1:

输入: 
    5
   / \
  3   6
 / \   \
2   4   7

Target = 9

输出: True

 

案例 2:

输入: 
    5
   / \
  3   6
 / \   \
2   4   7

Target = 28

输出: False

 

解法一

//时间复杂度O(n), 空间复杂度O(n)
/**
 * 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) return false;
        if(findTarget(root->left, k)) return true;
        if(us.count(root->val)) return true;
        us.insert(k - root->val);
        if(findTarget(root->right, k)) return true;
        return false;
    }
private:
    unordered_set us;
};

解法二

//时间复杂度O(n), 空间复杂度O(n)
/**
 * 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:
    void build(TreeNode* root) {
        if(!root) return;
        build(root->left);
        rec.push_back(root->val);
        build(root->right);
    }
    
    bool findTarget(TreeNode* root, int k) {
        build(root);
        int i = 0, j = rec.size() - 1;
        while(i < j) {
            if(rec[i] + rec[j] == k) return true;
            else if(rec[i] + rec[j] > k) j--;
            else if(rec[i] + rec[j] < k) i++;
        }
        return false;
    }
    
private:
    vector rec;
};

解法一

和第1题思路完全一样,只不过这个是遍历的树。采用哪种遍历方式都可以,这里我们采用了中序遍历。

解法二

解法一没有用到二叉搜索树的有序性质,这里我们就先用中序遍历构建一个有序数组,再使用双指针法寻找数对,这个思路以前在有一道题里面也见过。但是看起来这个修改并没有让程序性能多大的提高,甚至比解法一要更慢一些。

2019/06/14 20:38

你可能感兴趣的:(leetcode笔记)