【LeetCode-树】二叉搜索树的范围和

题目描述

给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。
二叉搜索树保证具有唯一的值。
示例

输入:root = [10,5,15,3,7,null,18], L = 7, R = 15
输出:32

输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10
输出:23

题目链接: https://leetcode-cn.com/problems/range-sum-of-bst/

思路

遍历整棵树就行,如果当前结点的值在 [L, R] 之间,则加入到结果中。
写法一
使用递归,代码如下

/**
 * 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:
    int rangeSumBST(TreeNode* root, int L, int R) {
        int ans = 0;
        dfs(root, L, R, ans);
        return ans;
    }

    void dfs(TreeNode* root, int L, int R, int& ans){
        if(root==nullptr) return;

        dfs(root->left, L, R, ans);
        if(L<=root->val && root->val<=R) ans += root->val;
        dfs(root->right, L, R, ans);
    }
};

可以在搜索的过程中剪枝,加快速度。代码如下:

/**
 * 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:
    int rangeSumBST(TreeNode* root, int L, int R) {
        int ans = 0;
        dfs(root, L, R, ans);
        return ans;
    }

    void dfs(TreeNode* root, int L, int R, int& ans){
        if(root==nullptr) return;

        if(L<root->val) dfs(root->left, L, R, ans);
        if(L<=root->val && root->val<=R) ans += root->val;
        if(R>root->val) dfs(root->right, L, R, ans);
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(h)
    h 为树高。

写法二
使用迭代,代码如下

/**
 * 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:
    int rangeSumBST(TreeNode* root, int L, int R) {
        if(root==nullptr or L>R) return 0;

        stack<pair<TreeNode*, bool>> s;
        s.push(make_pair(root, false));
        int ans = 0;
        while(!s.empty()){
            TreeNode* curNode = s.top().first;
            bool visit = s.top().second;
            s.pop();
            if(!visit){
                if(curNode->right!=nullptr) s.push(make_pair(curNode->right, false));
                s.push(make_pair(curNode, true));
                if(curNode->left!=nullptr) s.push(make_pair(curNode->left, false));
            }else{
                if(L<=curNode->val && curNode->val<=R) ans += curNode->val;
            }
        }
        return ans;
    }
};

上面的代码写成中序遍历,其实没有必要,随便一个遍历都行。

  • 时间复杂度:O(n)
  • 空间复杂度:O(h)
    h 为树高。
posted @ 2020-05-06 15:57  Flix  阅读(171)  评论(0编辑  收藏  举报