- 二叉搜索树的范围和
给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。
示例 1:
输入:root = [10,5,15,3,7,null,18], low = 7, high = 15
输出:32
示例 2:
输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10
输出:23
提示:
树中节点数目在范围 [1, 2 * 104] 内
1 <= Node.val <= 105
1 <= low <= high <= 105
所有 Node.val 互不相同
#include <iostream>
#include <vector>
#include <string>
using namespace std;// 定义二叉树节点结构体
struct TreeNode {int val; // 节点的值TreeNode* left; // 指向左子节点的指针TreeNode* right; // 指向右子节点的指针// 默认构造函数:初始化节点值为 0,左右子节点为空TreeNode() : val(0), left(nullptr), right(nullptr) {}// 构造函数:初始化节点值,并设置左右子节点为空TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}// 构造函数:初始化节点值,并指定左右子节点TreeNode(int x, TreeNode* left, TreeNode* right) : val(x), left(left), right(right) {}
};class Solution {
public:int rangeSumBST(TreeNode* root, int low, int high) {//int sum = 0; //每次调用清0,避免错误累加,不需要sum了,节点本身相加就够了if (!root) //当前节点不存在,停止递归return 0;if (root->val < low) //如果当前节点的值比low还小,只需要遍历右子树return rangeSumBST(root->right,low,high);if (root->val > high) //如果当前节点的值比high还大,只需要遍历左子树return rangeSumBST(root->left, low, high);//如果当前节点的值在[low,high],更新和return root->val+rangeSumBST(root->left, low, high)+rangeSumBST(root->right, low, high);}
};
// 释放二叉树的内存
void freeTree(TreeNode* root) {if (!root) return;freeTree(root->left);freeTree(root->right);delete root;
}int main() {// 构造测试二叉搜索树TreeNode* root = new TreeNode(10);root->left = new TreeNode(5);root->right = new TreeNode(15);root->left->left = new TreeNode(3);root->left->right = new TreeNode(7);root->right->right = new TreeNode(18);// 测试 rangeSumBSTSolution sol;int low = 7, high = 15;int sum = sol.rangeSumBST(root, low, high);cout << "范围 [" << low << ", " << high << "] 内的节点值之和为: " << sum << endl;// 释放二叉树的内存freeTree(root);return 0;
}