题目来源于知识星球—英雄算法联盟,七月算法集训专题
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!

当二叉搜索树为空树时,返回0.当根节点的值在low和high之间时,计算上根节点的值,
然后递归求得根节点左子树节点的值和右子树节点的值,累加即可。
class Solution
{
public:
int rangeSumBST(TreeNode* root, int low, int high)
{
int ans=0;
if(root==NULL)
{
return 0;
}
if(root->val>=low&&root->val<=high)
{
ans+=root->val;
}
return ans+rangeSumBST(root->left,low,high)+rangeSumBST(root->right,low,high);
}
};

首先对二叉树进行中序遍历,得到有序序列(升序),然后题目要求求得大于等于该节点值的
所有节点值之和,因此用for循环,将该节点后面的节点值相加即可。
class Solution
{
vector<TreeNode*>ans;
void dfs(TreeNode* root)
{
if(root)
{
dfs(root->left);
ans.push_back(root);
dfs(root->right);
}
}
public:
TreeNode* convertBST(TreeNode* root)
{
dfs(root);
for(int i=ans.size()-2;i>=0;i--)
{
ans[i]->val+=ans[i+1]->val;
}
return root;
}
};

与第二题思路一致
class Solution
{
vector<TreeNode*>ans;
void dfs(TreeNode* root)
{
if(root)
{
dfs(root->left);
ans.push_back(root);
dfs(root->right);
}
}
public:
TreeNode* convertBST(TreeNode* root)
{
dfs(root);
for(int i=ans.size()-2;i>=0;i--)
{
ans[i]->val+=ans[i+1]->val;
}
return root;
}
};

与第二题思路一致
class Solution
{
vector<TreeNode*>ans;
void dfs(TreeNode* root)
{
if(root)
{
dfs(root->left);
ans.push_back(root);
dfs(root->right);
}
}
public:
TreeNode* bstToGst(TreeNode* root)
{
dfs(root);
for(int i=ans.size()-2;i>=0;i--)
{
ans[i]->val+=ans[i+1]->val;
}
return root;
}
};
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!