📌  相关文章
📜  打印二叉树顶视图中的节点 |设置 3(1)

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

打印二叉树顶视图中的节点 | 设置 3

当我们需要展示二叉树的时候,常常需要从多个方向展示该树的节点,以便更好地理解该树的结构。其中之一就是顶视角,即从树的顶部往下看,展示该树的节点。本文将介绍如何编写程序,实现打印二叉树顶视图中的节点,并可以自定义视图的宽度。

实现思路

在二叉树的顶视图中,对于每一列,只需要将该列中最靠近根节点的节点打印出来即可。因此,我们需要记录下每一列中最靠近根节点的节点。为了方便记录,可以采用广度优先搜索(BFS)的方式,按层遍历二叉树,记录每个节点的列坐标,然后将该节点填入对应列的容器中。最终,只需要遍历该容器,取出每个容器中的首个节点即可。

代码实现

以下是 Python 语言实现的代码(假设二叉树的节点类为 TreeNode,有 val, left, rightcol 四个属性):

from collections import deque

def top_view(root, width=3):
    # 初始化
    queue = deque([(root, 0)])
    cols = [[] for _ in range(-width, width+1)]
    
    # BFS
    while queue:
        node, col = queue.popleft()
        cols[col].append(node)
        if node.left:
            queue.append((node.left, col-1))
        if node.right:
            queue.append((node.right, col+1))
    
    # 取出每一列的首个节点
    res = []
    for col in cols:
        if col:
            res.append(col[0].val)
    
    return res

该函数接受两个参数:root 为二叉树的根节点,width 为视图的宽度,即从左到右需要展示多少列节点(默认为 3)。

函数首先定义一个双端队列 queue 和一个列表 colsqueue 用于 BFS,cols 用于记录每个节点所在的列。cols 的索引为列坐标,即根节点所在列为 0,往左为负数,往右为正数,因此需要初始化 cols 为长度为 $2 \times \text{width} + 1$ 的空列表。

接着,将根节点和列坐标 0 入队,然后进行 BFS。对于队首节点,将其加入到对应列的容器中。如果该节点有左右子节点,则将其子节点和对应的列坐标入队。

最后,遍历 cols,取出每个容器中的第一个节点的值作为结果。

使用示例

以下是一个示例二叉树:

      1
     / \
    2   3
     \   \
      4   5
         /
        6

如图所示,该树的顶视图中,需要展示的节点依次为 2、1、3、5。

>>> root = TreeNode(1)
>>> root.left = TreeNode(2)
>>> root.right = TreeNode(3)
>>> root.left.right = TreeNode(4)
>>> root.right.right = TreeNode(5)
>>> root.right.right.left = TreeNode(6)

>>> top_view(root)
[2, 1, 3, 5]

我们也可以自定义视图的宽度,例如设置为 2:

>>> top_view(root, 2)
[2, 1, 3, 5]
总结

本文介绍了如何实现打印二叉树顶视图中的节点,并可以自定义视图的宽度。这是一种高效、直观的展示二叉树结构的方法,可以帮助程序员更好地理解树的结构和特征。