前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是七月集训第二十天:二叉搜索树🔥🔥🔥
一、练习题目
938. 二叉搜索树的范围和
剑指 Offer II 054. 所有大于等于节点的值之和
538. 把二叉搜索树转换为累加树
1038. 从二叉搜索树到更大和树
二、算法思路
- 1、938. 二叉搜索树的范围和:🔥递归去求满足结点范围的值即可。
- 2、剑指 Offer II 054. 所有大于等于节点的值之和:🔥🔥这道题会一题过三题非常爽,先中序遍历保存节点,因为二叉搜索树是中序遍历是递增序列,再从后遍历求后缀和即可。
- 3、538. 把二叉搜索树转换为累加树:🔥🔥同上。
- 4、1038. 从二叉搜索树到更大和树:🔥🔥同上。
三、源码剖析
// 938. 二叉搜索树的范围和
class Solution {
int sum = 0;
void dfs(TreeNode* root, int low, int high) {
if(root == nullptr) {
return ;
}
dfs(root->left, low, high);
if(root->val >= low && root->val <= high) {
sum += root->val; //(1)
}
dfs(root->right, low, high);
}
public:
int rangeSumBST(TreeNode* root, int low, int high) {
dfs(root, low, high);
return sum;
}
};
- 1、递归遍历,将满足条件的节点值进行累加即可。
// 剑指 Offer II 054. 所有大于等于节点的值之和
// 538. 把二叉搜索树转换为累加树
// 1038. 从二叉搜索树到更大和树
class Solution {
vector<TreeNode*> iod;
void dfs(TreeNode* root) {
if(root == nullptr) {
return ;
}
dfs(root->left);
iod.emplace_back(root);
dfs(root->right);
} //(1)
public:
TreeNode* convertBST(TreeNode* root) {
dfs(root);
for(int i = iod.size() - 2; i >= 0; i--) {
iod[i]->val += iod[i + 1]->val; //(2)
}
return root;
}
};
- 1、先中序遍历,记录节点值;
- 2、再从后遍历,求后缀和。