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

📅  最后修改于: 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)。