官方的题目解释永远晦涩难懂
这就是最大的拦路虎
简单介绍,将二叉搜索树,转换成“更大和树”,“最大的和树”,就是更新节点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) {}
* };
*/
//给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。理解为:每个节点替换后的新值等于原树中所有「大于或等于该节点值」的和。
class Solution {
public:
TreeNode* bstToGst(TreeNode* root) {
//要点巧劲
//观察二叉搜索树
//其实就是进行右中左遍历
dfs(root, 0);
return root;
}
// val : 以父节点为根的右子树的和(包括节点)
int dfs(TreeNode* root, int val){
if(!root){
return 0;
}
int ans = 0;
ans += dfs(root->right, val);
ans += root->val;
root->val = ans + val;
ans += dfs(root->left, root->val);
return ans;
}
};