题目链接:从二叉搜索树到更大和树
题干解析:
题目意思很明确,把二叉搜索树中每个节点的val替换为二叉搜索树中所有val大于等于该节点val的节点值之和。
思路分析:
这个题有两种思路:自顶向下和自底向上;
首先讲一下自顶向下的方法,这个方法理解起来比较简单,但是实现起来比较复杂且臃肿。
对于每一个节点(看作根节点),先计算其左节点(根节点的更大节点和+该节点右子树+本身)和右节点(根节点的根节点的更大节点和+该节点右子树+本身),由此规律进行自顶向下进行递归计算。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* 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:
unordered_map<TreeNode*, int> tree_sum;
int temp;
int calculate_tree_sum(TreeNode* root){
if(root == nullptr){
return 0;
}
if(tree_sum[root]){
return tree_sum[root];
}
tree_sum[root] = root -> val + calculate_tree_sum(root -> left) + calculate_tree_sum(root -> right);
return tree_sum[root];
}
void swap(TreeNode* root, int bigger){
if(root == nullptr){
return;
}
int temp = root -> val;
root -> val += calculate_tree_sum(root -> right) + bigger;
swap(root -> left, root -> val);
swap(root -> right, bigger);
}
TreeNode* bstToGst(TreeNode* root) {
swap(root, 0);
return root;
}
};
另外一种是自底向上的解法:
这个方法利用到二叉树的性质,先迭代至二叉搜索树右端底部,随后往回迭代。优雅~
class Solution {
public:
int sum = 0;
TreeNode* bstToGst(TreeNode* root) {
if (root != nullptr) {
bstToGst(root->right);
sum += root->val;
root->val = sum;
bstToGst(root->left);
}
return root;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/binary-search-tree-to-greater-sum-tree/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。