给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。
解题思路
在二叉搜索树中,对于任意节点cur
,它右子树的所有节点值都比它大,左子树的所有节点值都比它小。因此,如果我们按照「右-根-左」的顺序对树进行遍历,那么遍历过程中,我们可以逐步累加已经访问过的节点的值,这样可以很方便地实现题目要求。
完整代码如下:
# 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 convertBST(self, root: TreeNode) -> TreeNode:
self.pre = 0 # 记录前一个节点的数值
self.traversal(root)
return root
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)
class Solution:
def convertBST(self, root: TreeNode) -> TreeNode:
self.pre = 0 # 记录前一个节点的数值
self.traversal(root)
return root
- 这段代码定义了一个
Solution
类,其中包含一个convertBST
方法和一个traversal
方法。 self.pre
用于保存当前节点在遍历过程中,已经累加的所有节点的值。convertBST
方法接收一个二叉搜索树的根节点root
,调用traversal
方法对树进行处理,最终返回处理后的树。
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)
traversal
方法是一个递归函数,用于以「右-根-左」的顺序遍历二叉树。- 首先检查当前节点
cur
是否为空。如果为空,则直接返回,因为空节点没有任何操作。 - 递归调用
self.traversal(cur.right)
,首先处理当前节点的右子树,这样就可以访问到树中值最大的节点。 - 然后将当前节点的值
cur.val
加上self.pre
的值,并更新self.pre
为当前节点的新值。这样就完成了累加。 - 最后,递归调用
self.traversal(cur.left)
,处理当前节点的左子树。