Leetcode Link: 538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
题目
给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:
节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。

解法一
思路:反中序遍历 由示例1可以看出来,就是我需要先去找到最右下角的节点,然后一点一点求和sum,我们需要在第二次访问节点的时候执行动作。显然这属于中序遍历的逆序。
题解:
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
def recur(node):
nonlocal sum
if not node:
sum += 0
return
# 反中序,先右后左
recur(node.right)
# 执行累加
sum = sum + node.val
node.val = sum
recur(node.left)
sum = 0
recur(root)
return root启发和联系
二刷竟然没做出来
错误分析 实际上本题是指针游走,在游走的过程中记录累加和,并无返回值。
而我二刷时,过分依赖左右树的返回值,即我想当然的认为左右树的返回值一定要有,且一定要用上,如node.val=node.val+right来保存当前节点的值,但这只对一部分节点是正确的。
我开始想的是返回当前的累加和,但是左树无法获取当前的累加和,导致一直调不出来。