📌  相关文章
📜  打印除二叉树每一层最右边节点之外的所有节点(1)

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

打印除二叉树每一层最右边节点之外的所有节点

在二叉树中,每一层最右边的节点通常是比较难以处理的,而除此以外的节点则可以通过简单的遍历和打印输出。在这个任务中,我们需要编写一个函数,可以打印出除每一层最右边的节点之外的所有节点。

解题思路

要求除每一层最右边的节点之外的所有节点,可以通过广度优先搜索(BFS)来解决。BFS 可以按层次遍历二叉树,并在每一层结束时,忽略最右边的节点。

基本思想
  • 首先,使用队列存储要遍历的节点,初始化队列并将根节点入队列。
  • 在每一层中,使用当前队列中的节点来创建下一层,并将新节点入队列。在这个过程中,忽略该层最右侧的节点。
  • 重复步骤 2,直到队列为空。
  • 在遍历过程中,所有不在每一层最右边的节点都可以直接打印输出。
解决方案

在每一层结束时,记录最右边的节点,并将其忽略。可以使用一个 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)。

参考文献

以下是本文编写中参考的文献: