📌  相关文章
📜  更改二叉树,使每个节点都存储左子树中所有节点的总和(1)

📅  最后修改于: 2023-12-03 14:55:14.115000             🧑  作者: Mango

更改二叉树,使每个节点都存储左子树中所有节点的总和

在二叉树中,每个节点都可以有左右两个子节点。本题的目标是修改二叉树,使每个节点都存储左子树中所有节点的总和。

我们可以使用递归的方式来处理每个节点。对于每个节点,只需先修改其左子节点,再计算左子树中所有节点的总和,并将该值更新到当前节点的值中。最后,再递归处理其右子节点。

以下是一个示例代码,可供参考:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def sumLeftNode(self, root: TreeNode) -> int:
        if not root:
            return 0

        sum_left = self.sumLeftNode(root.left)
        root.val += sum_left

        sum_right = self.sumLeftNode(root.right)
        return root.val + sum_right

    def modifyTree(self, root: TreeNode) -> TreeNode:
        self.sumLeftNode(root)
        return root

该代码使用了两个函数,其中 sumLeftNode 函数用于递归地处理每个节点,计算其左子树中所有节点的总和,并返回当前节点的值加上右子树节点的总和。而 modifyTree 函数则是整个程序的入口,它用于调用 sumLeftNode 函数,并返回根节点。

为了更好地理解这段代码,我们可以结合下面的例子进行说明:

假设存在二叉树

       1
     /   \
   2      3
  / \    / \
 4   5  6   7

我们按照以下步骤进行修改:

  1. 对于根节点 1,先递归处理其左子节点 2。现在,节点 2 的值已经修改为 4,因为它的左子树为空。
  2. 接下来,对于节点 1,将节点 2 的值(即 4)加到节点 1 中,即使节点 1 的值变为了 5。
  3. 然后,继续递归处理节点 1 的右子节点 3。现在,节点 3 的左右子节点均为空,其值不变。
  4. 最后,返回节点 1 的值 5 加上节点 3 的值 3,得到根节点的总和 8。

修改后的二叉树为

       5
     /   \
    6      3
  / \    / \
 4   5  6   7

可以看到,每个节点都存储了其左子树中所有节点的总和。这样做可以方便我们查找某个节点的子节点个数,从而进行各种操作。