天天看點

653. 兩數之和 IV - 輸入 BST653. 兩數之和 IV - 輸入 BST

653. 兩數之和 IV - 輸入 BST

1.題目描述

給定一個二叉搜尋樹和一個目标結果,如果 BST 中存在兩個元素且它們的和等于給定的目标結果,則傳回 true。

案例 1:

653. 兩數之和 IV - 輸入 BST653. 兩數之和 IV - 輸入 BST

案例 2:

653. 兩數之和 IV - 輸入 BST653. 兩數之和 IV - 輸入 BST

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)