📅  最后修改于: 2023-12-03 15:07:57.640000             🧑  作者: Mango
二叉树的顶视图指的是从二叉树的顶部向下看,可以看到的节点。在这个视图中,每一层最左边的节点和最右边的节点都会被打印出来。这个问题可以用广度优先搜索(BFS)解决。
我们从根节点开始,对于每一层,我们只打印该层第一次被访问的节点(即最左边的节点),然后将其左右子节点加入队列。这样,最后我们就得到了该二叉树的顶视图。
以下是用Python实现的代码片段,假设二叉树的节点保存在TreeNode类中。
from collections import deque
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def top_view(root):
if not root:
return []
# 使用哈希表保存每个节点的位置和值
min_pos, max_pos = float('inf'), float('-inf')
node_map = {}
q = deque([(root, 0)])
while q:
node, pos = q.popleft()
# 如果该位置上还没有节点被访问过,则将该节点加入结果
if pos not in node_map:
node_map[pos] = node.val
min_pos = min(min_pos, pos)
max_pos = max(max_pos, pos)
# 将该节点的左右子节点加入队列
if node.left:
q.append((node.left, pos - 1))
if node.right:
q.append((node.right, pos + 1))
# 将哈希表中的结果按位置从小到大排序
res = [node_map[i] for i in range(min_pos, max_pos+1)]
return res
该代码的时间复杂度为O(nlogn),其中n是二叉树节点的个数。我们需要遍历每个节点,并将其插入到哈希表中。最坏情况下,二叉树是一棵平衡二叉树,这时我们需要插入的节点个数为n,每次插入的时间复杂度为O(logn)。而哈希表的大小与节点数相同,因此时间复杂度是O(nlogn)。