题目:
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node
的新值等于原树中大于或等于 node.val
的值之和。提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
示例:
- 输入: [ 4 , 1 , 6 , 0 , 2 , 5 , 7 , n u l l , n u l l , n u l l , 3 , n u l l , n u l l , n u l l , 8 ] [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8] [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
- 输出: [ 30 , 36 , 21 , 36 , 35 , 26 , 15 , n u l l , n u l l , n u l l , 33 , n u l l , n u l l , n u l l , 8 ] [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8] [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
解题思路:(递归)
-
确定递归函数的参数和返回值:
void dfs(TreeNode* cur)
-
确定终止条件:
遇到空就返回。if(cur == NULL) return;
-
确定单层递归的逻辑:
右中左反中序遍历,进行累加即可。dfs(cur->right); cur->val += pre; pre = cur->val; dfs(cur->left);
C++版整体代码
class Solution {
public:
int pre = 0;
void dfs(TreeNode* cur){
if(cur == NULL) return;
dfs(cur->right);
cur->val += pre;
pre = cur->val;
dfs(cur->left);
}
TreeNode* convertBST(TreeNode* root) {
dfs(root);
return root;
}
};