📌  相关文章
📜  二叉树所有垂直层次的总和(1)

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

二叉树所有垂直层次的总和

介绍

二叉树是计算机科学中最为基础的数据结构之一,其中每个节点最多有两个子节点。在二叉树中,垂直层次指的是从根节点到叶子节点所经过的边的数量。本文将介绍如何求取二叉树中所有垂直层次的总和,这在某些应用场景下非常有用。

实现思路

这里介绍两种实现思路。

思路一

我们可以使用哈希表来存储每个节点所处的垂直层次,然后对每个节点进行遍历,累加它们的垂直层次值即可。

具体操作步骤如下:

  1. 创建一个哈希表 table,用于存储节点的垂直层次。
  2. 创建一个队列 queue,并将根节点入队。
  3. 对于队列中的每个节点:
    1. 从队列头部弹出一个节点 node
    2. 如果 node 左子节点不为空,将左子节点入队,并将 node 垂直层次值减一存入 table
    3. 如果 node 右子节点不为空,将右子节点入队,并将 node 垂直层次值加一存入 table
  4. 遍历 table 中的每对键值对,累加所有的垂直层次值并返回结果。

具体的算法实现可参考以下 Python 代码:

def vertical_sum(root):
    table = {}
    queue = [(root, 0)]
    while queue:
        node, level = queue.pop(0)
        if node.left:
            queue.append((node.left, level - 1))
            table[level - 1] = table.get(level - 1, 0) + node.left.val
        if node.right:
            queue.append((node.right, level + 1))
            table[level + 1] = table.get(level + 1, 0) + node.right.val
    return sum(table.values())
思路二

我们也可以不使用哈希表,而是使用一个数组来存储每个垂直层次的节点值之和,从而避免使用哈希表的额外空间。

具体操作步骤如下:

  1. 创建一个数组 sums,用于记录每个垂直层次的节点值之和。
  2. 创建一个队列 queue,并将根节点和垂直层次值入队。
  3. 对于队列中的每个节点:
    1. 从队列头部弹出一个节点 node 和它的垂直层次值 level
    2. 将该节点的值加入 sums 数组中 level 对应的位置。
    3. 如果 node 的左子节点不为空,将左子节点和 level - 1 入队。
    4. 如果 node 的右子节点不为空,将右子节点和 level + 1 入队。
  4. 遍历 sums 数组,累加所有的节点值之和并返回结果。

具体的算法实现可参考以下 Python 代码:

def vertical_sum(root):
    leftmost, rightmost = float('inf'), float('-inf')
    queue = [(root, 0)]
    while queue:
        node, level = queue.pop(0)
        leftmost = min(leftmost, level)
        rightmost = max(rightmost, level)
        if node.left:
            queue.append((node.left, level - 1))
        if node.right:
            queue.append((node.right, level + 1))
    sums = [0] * (rightmost - leftmost + 1)
    queue = [(root, 0 - leftmost)]
    while queue:
        node, level = queue.pop(0)
        sums[level] += node.val
        if node.left:
            queue.append((node.left, level - 1))
        if node.right:
            queue.append((node.right, level + 1))
    return sum(sums)
总结

本文介绍了如何求取二叉树中所有垂直层次的节点值之和,包括了使用哈希表和数组两种实现思路。这种算法的时间复杂度为 $O(n)$,其中 $n$ 表示二叉树中的节点数量。在一些与二叉树的结构有关的问题中使用这种算法非常有用,例如在二叉树的可视化中,我们可以根据节点的垂直层次对它们进行排列。