二叉树——21.把二叉搜索树转换为累加树

力扣题目链接

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(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),处理当前节点的左子树。

你可能感兴趣的:(算法)