难度简单
给定二叉搜索树的根结点 root
,返回值位于范围 [low, high]
之间的所有结点的值的和。
示例 1:
输入:root = [10,5,15,3,7,null,18], low = 7, high = 15 输出:32
思路一:递归+剪枝:
通过递归搜索方式遍历各节点:
① 若当前节点为空,返回 0;
② 若当前节点大于最大值,返回左子树的和;
③ 若当前节点小于最小值,返回右子树的和;
④ 返回已当前结点为根节点的树的和。
代码:
// 递归实现 + 剪枝
int rangeSumBST(TreeNode* root, int low, int high) {
if(root==nullptr) return 0;
if(root->val > high) return rangeSumBST(root->left, low, high);
if(root->val < low) return rangeSumBST(root->right, low, high);
return root->val + rangeSumBST(root->left, low, high) + rangeSumBST(root->right, low, high);
}
思路二:迭代:
遍历全部的节点,节点满足条件的加入结果中
代码:
// 迭代实现
int rangeSumBST(TreeNode* root, int low, int high) {
stack<TreeNode*> data;
TreeNode* cur;
data.push(root);
int ans=0;
while(!data.empty()){
cur = data.top();
data.pop();
if(cur){
if(cur->right) data.push(cur->right);
if(cur->left) data.push(cur->left);
data.push(cur);
data.push(nullptr);
}else{
if(data.top()->val >= low && data.top()->val <= high ) ans+=data.top()->val;
data.pop();
}
}
return ans;
}
思路二:迭代 + 剪枝:
通过迭代搜索方式遍历各节点:
① 若当前节点为空,继续循环;
② 若当前节点大于最大值,压入左节点;
③ 若当前节点小于最小值,压入右节点;
④ 将该节点值加入结果中,并压入子节点。
代码:
// 迭代+剪枝
int rangeSumBST(TreeNode *root, int low, int high) {
int sum = 0;
queue<TreeNode*> q({root});
while (!q.empty()) {
auto node = q.front();
q.pop();
if (node == nullptr) {
continue;
}
if (node->val > high) {
q.push(node->left);
} else if (node->val < low) {
q.push(node->right);
} else {
sum += node->val;
q.push(node->left);
q.push(node->right);
}
}
return sum;
}