LeetCode 538.把二叉搜索树转换为累加树
题目描述
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node
的新值等于原树中大于或等于 node.val
的值之和。
提醒一下,二叉搜索树满足下列约束条件:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
示例 1:
输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
示例 2:
输入:root = [0,null,1]
输出:[1,null,1]
示例 3:
输入:root = [1,0,2]
输出:[3,3,2]
示例 4:
输入:root = [3,2,4,1]
输出:[7,9,4,10]
提示:
- 树中的节点数介于
0
和10^4
之间。 - 每个节点的值介于
-10^4
和10^4
之间。 - 树中的所有值 互不相同 。
- 给定的树为二叉搜索树。
思路
依次从后向前(右中左)遍历二叉搜索树,每遍历一次就累加并记录值。
递归法
递归三部曲:
- 确定递归函数的参数和返回值。参数就是数组、左下标left和右下标right,递归函数的返回值是节点指针。
- 确定终止条件。遇空节点就终止。
- 确定单层递归的逻辑。要右中左来遍历二叉树,中节点的处理逻辑就是让cur的数值加上前一个节点的数值。
代码
C++版:
/**
* 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:
// 递归法,右中左
int pre=0; // 前一个节点的累加值
void traversal(TreeNode* cur){
if(cur==NULL) return ;
traversal(cur->right); // 右
cur->val=cur->val+pre; // 中
pre=cur->val;
traversal(cur->left); // 左
}
TreeNode* convertBST(TreeNode* root) {
traversal(root);
return root;
}
};
Python版:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
# 递归法
def traversal(self, cur):
if cur is None:
return
self.traversal(cur.right)
cur.val += self.pre
self.pre = cur.val
self.traversal(cur.left)
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
self.pre = 0 # 记录前一个节点的数值
self.traversal(root)
return root