题目来源于知识星球—英雄算法联盟,七月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、938.二叉搜索树的范围和(简单)
1.题目描述
2.解题思路
当二叉搜索树为空树时,返回0.当根节点的值在low和high之间时,计算上根节点的值,
然后递归求得根节点左子树节点的值和右子树节点的值,累加即可。
3.代码演示(C++)
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);
}
};
4.题目链接
二、剑指 Offer II 054.所有大于等于节点的值之和(中等)
1.题目描述
2.解题思路
首先对二叉树进行中序遍历,得到有序序列(升序),然后题目要求求得大于等于该节点值的
所有节点值之和,因此用for循环,将该节点后面的节点值相加即可。
3.代码演示(C++)
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;
}
};
4.题目链接
三、538.把二叉搜索树转换为累加树(中等)
1.题目描述
2.解题思路
与第二题思路一致
3.代码演示(C++)
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;
}
};
4.题目链接
四、1038.从二叉搜索树到更大和树(中等)
1.题目描述
2.解题思路
与第二题思路一致
3.代码演示(C++)
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;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!