class Solution {
public:
//每个节点的新值等于节点自身值与右边所有节点值之和(注意,是右边所有节点,而不是右子树节点)
//根结点右子树中的节点值更新为自身值加上右子树中所有节点的值
//而左子树中节点的值更新为自身值+右子树值之和+根节点的累加和
//遍历每一个节点的右子树,并对其值进行累加
//遍历节点右子树,对值进行累加
int dfs(TreeNode* root)
{
if(!root) return 0;
int sum = root->val;
sum += dfs(root->left);
sum += dfs(root->right);
return sum;
}
//dfs()处理完后,对根结点的左子树进行单独处理,对每一个节点加上根结点的值
void dfsLeft(TreeNode* root,int sum)
{
if(!root) return ;
TreeNode* cur = root;
dfsLeft(cur->left,sum);
dfsLeft(cur->right,sum);
cur->val += sum;
}
TreeNode* convertBST(TreeNode* root) {
if(!root) return root;
root->val += dfs(root->right);
convertBST(root->left);
convertBST(root->right);
dfsLeft(root->left,root->val);
return root;
}
};
官方题解
中序遍历得到升序序列,而反序中序遍历即可得到降序序列,反序中序遍历的同时,对每一个节点值进行累加即可。
class Solution {
public:
int sum = 0;
TreeNode* convertBST(TreeNode* root) {
if (root != nullptr) {
convertBST(root->right);
sum += root->val;
root->val = sum;
convertBST(root->left);
}
return root;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/solution/ba-er-cha-sou-suo-shu-zhuan-huan-wei-lei-jia-sh-14/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。