📌  相关文章
📜  检查二叉树顶视图中的节点是否形成回文数(1)

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

检查二叉树顶视图中的节点是否形成回文数

简介

给定一棵二叉树,我们将其从顶部看做,看到的第一个节点为根节点,第二个节点为其左子节点或右子节点中最靠近根节点的一个,第三个节点为其左子节点或右子节点中离根节点更远的节点,以此类推,直至最后一层。

现在你需要编写一个函数,检查这些从顶部所看到的节点是否形成回文数。

示例

以如下二叉树为例:

      3
    /   \
   4     4
  / \   / \
 5   6 6   5

从顶部看去,节点序列为 [3,4,5,6,5,4,4,6]。这个序列是一个回文数,因此函数应该返回 True

思路

我们可以对二叉树按照上述规则进行遍历,并将每一层的节点值存储为一个列表。然后判断这个列表是否是回文数即可。

具体而言,我们可以使用 BFS(广度优先搜索)算法进行遍历。在遍历时,我们需要记录每个节点的层数,以便将节点值存储到正确的列表中。并且,我们需要在处理每个节点时同时记录左右子节点和层数,以便加入队列中进行下一层遍历。

代码

下面是 Python 语言的实现代码。为了简化代码,我们将节点的层数和节点值都存储在了一个元组中。另外,我们使用了 collections 模块中的 deque 类型来实现队列。

import collections

def is_palindrome(root):
    if not root:
        return True
    
    # 存储每一层的节点值
    levels = []
    
    # BFS 遍历二叉树
    queue = collections.deque([(root, 0)])
    while queue:
        node, level = queue.popleft()
        
        # 将节点值加入到对应层的列表中
        if level < len(levels):
            levels[level].append(node.val)
        else:
            levels.append([node.val])
        
        # 将左右子节点加入队列中
        if node.left:
            queue.append((node.left, level + 1))
        if node.right:
            queue.append((node.right, level + 1))
    
    # 判断每一层的节点值是否是回文数
    for level in levels:
        if level != level[::-1]:
            return False
    
    return True
复杂度

时间复杂度:$O(n)$,其中 $n$ 是二叉树中的节点个数,因为我们需要遍历每个节点一次。

空间复杂度:$O(n)$,我们需要存储每一层的节点值所对应的列表,因此需要的额外空间为 $O(n)$。