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