LeetCode 653. Two Sum IV - Input is a BST

155 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
};