赞
踩
给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。
题目的意思,节点的值在[L, R]这个区间内,就加到结果里,求所有符合条件的节点值加和
示例 1:
输入:root = [10,5,15,3,7,null,18], L = 7, R = 15
输出:32
示例 2:
输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10
输出:23
提示:
树中的结点数量最多为 10000 个。
最终的答案保证小于 2^31。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-of-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution { public: int rangeSumBST(TreeNode* root, int L, int R) { int sum = 0; sumLR(root,L,R,sum); return sum; } void sumLR(TreeNode* root,int &L,int &R,int &sum) { if(root == NULL) return; if(root->val >= L && root->val <= R) { sum += root->val; sumLR(root->left,L,R,sum); sumLR(root->right,L,R,sum); } else if(root->val < L) {//左子树都小于L,砍了 sumLR(root->right,L,R,sum); } else if(root->val > R) {//右子树都大于R,砍了 sumLR(root->left,L,R,sum); } } };
运行时间比较长,可能减的枝子没有递归多,递归枝杈比较多,随着深度变大,很大程度可被减掉
class Solution { public: int rangeSumBST(TreeNode* root, int L, int R) { int sum = 0; stack<TreeNode*> stk; while(root || !stk.empty()) { while(root) { stk.push(root); root = root->left; } root = stk.top(); stk.pop(); if(root->val >= L && root->val <= R) sum += root->val; else if(root->val > R)//中序非降,后面都大于R break; root = root->right; } return sum; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。