📌  相关文章
📜  给定二叉树的垂直总和 |设置 1(1)

📅  最后修改于: 2023-12-03 15:41:16.391000             🧑  作者: Mango

给定二叉树的垂直总和

问题描述

给定一个二叉树,计算其垂直总和。即,从左侧到右侧,树的每个垂直列的节点值的总和。

问题分析

首先,了解一下什么是二叉树的垂直列。假设根节点的 x 坐标为 0,每个节点都有一个唯一的 x 坐标,它等于它的父节点的 x 坐标加上一个偏移量。然后,我们可以将节点按照它们的 x 坐标分成各种垂直列。垂直总和是每个垂直列的节点值之和。

为了计算垂直总和,我们可以使用 BFS(广度优先搜索)遍历二叉树。我们使用一个队列来存储每个节点和它的坐标。为了处理节点的坐标,我们还需要一个数据结构来存储每个垂直列的节点值之和。这可以是一个 map,其中键是坐标,而值是节点值之和。

我们从根节点开始 BFS 遍历,在访问每个节点时,我们将其从队列中弹出,并将其值添加到相应列的总和中。然后,我们将其左右子节点和它们的坐标加入队列中。

最后,我们可以遍历所有列的总和,并将它们加在一起以得到垂直总和。

算法实现

下面是这个算法的 Python 实现代码:

from collections import defaultdict, deque

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

def vertical_sum(root: TreeNode) -> int:
    col_sum = defaultdict(int)
    queue = deque([(root, 0)])

    while queue:
        node, col = queue.popleft()

        if node:
            col_sum[col] += node.val
            queue.append((node.left, col - 1))
            queue.append((node.right, col + 1))

    return sum(col_sum.values())
总结

本文介绍了如何计算二叉树的垂直总和。我们使用 BFS 遍历二叉树,并使用一个 map 存储每个垂直列的节点值之和。这个算法的时间复杂度是 O(n),其中 n 是二叉树中的节点数。