给定二叉搜索树的根结点 root,返回 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。
思路:
题中已经说明,给出的结点是一个二叉搜索树的结点,刚好是一个二叉搜索树的层序遍历(我一眼没看出来),但是为了测试,还是把二叉搜索树的生成写出来了,然后遍历就行了,遍历的时候判断结点值的大小,决定是否相加
本菜鸡还是用递归遍历
#include<iostream>
#include<cstdlib>
using namespace std;
typedef struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
} TreeNode,*SearchTree,*Position;
SearchTree MakeEmpty(SearchTree T)
{
if(T!=NULL)
{
MakeEmpty(T->left);
MakeEmpty(T->right);
free(T);
}
return NULL;
}
SearchTree Insert(int val,SearchTree T)
{
if(T==NULL)
{
T = (SearchTree)malloc(sizeof(TreeNode));
if(T==NULL)
{
printf("MALLOC ERROR\n");
exit(1);
}
T->val = val;
T->left = T->right = NULL;
}
else
{
if(val<T->val)
T->left = Insert(val,T->left);
else if(val>T->val)
T->right = Insert(val,T->right);
}
return T;
}
void InOrderTraversal(SearchTree T)
{
if(T==NULL)
return ;
InOrderTraversal(T->left);
printf("%d ",T->val);
InOrderTraversal(T->right);
}
class Solution
{
public:
int sum = 0;
int rangeSumBST(TreeNode* root, int L, int R)
{
if(root==NULL)
return 0;
if(root->val>=L && root->val<=R)
sum+=root->val;
rangeSumBST(root->left,L,R);
rangeSumBST(root->right,L,R);
return sum;
}
};
int main()
{
Solution s;
SearchTree T = NULL;
T = Insert(10,T);
T = Insert(5,T);
T = Insert(15,T);
T = Insert(3,T);
T = Insert(7,T);
T = Insert(18,T);
// InOrderTraversal(T);
// printf("\n");
int sum;
sum = s.rangeSumBST(T,7,15);
cout<<sum<<endl;
return 0;
}