📅  最后修改于: 2023-12-03 15:39:42.237000             🧑  作者: Mango
在二叉树中,每一层最右边的节点通常是比较难以处理的,而除此以外的节点则可以通过简单的遍历和打印输出。在这个任务中,我们需要编写一个函数,可以打印出除每一层最右边的节点之外的所有节点。
要求除每一层最右边的节点之外的所有节点,可以通过广度优先搜索(BFS)来解决。BFS 可以按层次遍历二叉树,并在每一层结束时,忽略最右边的节点。
在每一层结束时,记录最右边的节点,并将其忽略。可以使用一个 last
变量来保存当前层的最右边的节点,然后在循环队列时检查每个节点是否为最右侧的节点。如果不是,则直接将节点输出。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def print_other_nodes(root: TreeNode):
"""
打印除每一层最右边节点之外的所有节点
"""
if not root:
return
queue = [root]
while queue:
qsize = len(queue)
last = None # 当前层最右边的节点
for i in range(qsize):
node = queue.pop(0)
if node.left:
queue.append(node.left)
last = node.left
if node.right:
queue.append(node.right)
last = node.right
if i != qsize - 1: # 不是最右边的节点
print(node.val, end=' ')
if last: # 最右边的节点不为空,则不打印最右边的节点。
queue.append(last)
print()
首先判断根节点是否为空,为空则直接返回。将根节点存储在队列中,然后进行 while 循环。在该循环中,首先获取当前层的所有节点,并将当前层右侧的节点存储在 last
变量中。在检查每个节点时,如果不是最右边的节点,则输出节点的值,否则不输出。然后,将当前层右侧的节点添加到队列中,以进行下一次循环。最后,在每一层结束时,输出一个换行符以区分不同层的节点列表。
遍历整个二叉树需要 O(N) 的时间复杂度,其中 N 是节点的总数。在最坏的情况下,队列中可能会包含所有的节点,因此空间复杂度为 O(N)。
BFS 需要占用相当多的空间,只存储最后一行需要 O(N) 的空间(在最坏情况下)。因此,空间复杂度为 O(N)。
以下是本文编写中参考的文献: