【问题标题】:Leetcode Problem 1038. Binary Search Tree to Greater Sum Tree --> PythonLeetcode 问题 1038. 二叉搜索树到大和树 --> Python
【发布时间】:2021-02-03 08:27:09
【问题描述】:

我正在用 Python 做上面的 leetcode 问题。通常我所做的是在 jupyter notebook 中解决问题,然后在完成后将其复制并粘贴到 leetcode 解决方案框中。但是,我遇到了这个问题。

问题定义如下:

给定二叉搜索树 (BST) 的根,将其转换为更大的树,使得原始 BST 的每个键都更改为原始键加上所有大于 BST 中原始键的键的总和。

提醒一下,二叉搜索树是满足这些约束的树:

节点的左子树只包含键小于节点键的节点。 节点的右子树只包含键大于节点键的节点。 左右子树也必须是二叉搜索树。

该问题的示例输入和输出如下所示

Input: root = [4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
Output: [30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

进一步设置问题解决方案如下

# 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 bstToGst(self, root: TreeNode) -> TreeNode:

我对如何解决这个问题感到困惑。最初我以为我会在提供的列表中进行某种循环。然而,在阅读了讨论中的一些示例响应后,我看到使用了诸如 root.right 和 root.left 之类的命令。我该如何在 jupyter 笔记本中执行此操作?我没有使用 TreeNodes 的经验,所以我想以正确的方式解决这个问题并学习基本概念,而不是用另一种方式强行通过它。非常感谢所有帮助。

谢谢

【问题讨论】:

  • 使用reverse-order-traversal 按从大到小的顺序读取节点。维护一个初始化为0的全局累加器。读取任意一个节点时,将全局累加器的值加到节点上,然后将节点的原始值加到累加器中

标签: python


【解决方案1】:

定义一个迭代器函数以倒序遍历节点,然后通过节点反向累加总和并将值分配给每个节点:

class Solution:
    def revNodes(self,node):
        if node.right: yield from self.revNodes(node.right)
        yield node
        if node.left:  yield from self.revNodes(node.left)
        
    def bstToGst(self, root):
        total = 0
        for node in self.revNodes(root):
            node.val = total = node.val + total

输出:

data  = [4,1,6,0,2,5,7,None,None,None,3,None,None,None,8]
nodes = [v if v is None else TreeNode(v) for v in data]
for i,node in enumerate(nodes):
    if not node: continue
    if 2*i+1<len(nodes): node.left  = nodes[2*i+1]
    if 2*i+2<len(nodes): node.right = nodes[2*i+2]    
root = nodes[0]


print(root) # BEFORE

      4
   __/ \_
  1      6
 / \    / \
0   2  5   7
     \      \
      3      8

Solution().bstToGst(root)

print([node.val if node else None for node in nodes])
[30, 36, 21, 36, 35, 26, 15, None, None, None, 33, None, None, None, 8]    

print(root) # AFTER

        30
     __/  \__
   36        21
  /  \      /  \
36    35  26    15
        \         \
         33        8

请注意,为了打印树,我必须在 TreeNode 类中添加一个 repr() 方法

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
    def __repr__(self):
        nodeInfo = lambda n:(str(n.val),n.left,n.right)
        return "\n".join(printBTree(self,nodeInfo,isTop=False))

printBTree 函数来自我过去提供的另一个答案here

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多