📅  最后修改于: 2023-12-03 15:10:01.544000             🧑  作者: Mango
当我们需要展示二叉树的时候,常常需要从多个方向展示该树的节点,以便更好地理解该树的结构。其中之一就是顶视角,即从树的顶部往下看,展示该树的节点。本文将介绍如何编写程序,实现打印二叉树顶视图中的节点,并可以自定义视图的宽度。
在二叉树的顶视图中,对于每一列,只需要将该列中最靠近根节点的节点打印出来即可。因此,我们需要记录下每一列中最靠近根节点的节点。为了方便记录,可以采用广度优先搜索(BFS)的方式,按层遍历二叉树,记录每个节点的列坐标,然后将该节点填入对应列的容器中。最终,只需要遍历该容器,取出每个容器中的首个节点即可。
以下是 Python 语言实现的代码(假设二叉树的节点类为 TreeNode
,有 val
, left
, right
和 col
四个属性):
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
和一个列表 cols
,queue
用于 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]
本文介绍了如何实现打印二叉树顶视图中的节点,并可以自定义视图的宽度。这是一种高效、直观的展示二叉树结构的方法,可以帮助程序员更好地理解树的结构和特征。