[剑指Offer] 32_从上到下打印二叉树

版权声明:Tian Run https://blog.csdn.net/u013908099/article/details/86418299

题目

1. 不分行从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点,按照从左到右的顺序打印。

例:

输入:
            8
           / \
          6  10
         / \ / \
        5  7 9 11
输出:8, 6, 10, 5, 7, 9, 11

2. 分行从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点,按照从左到右的顺序打印。
每一层打印到一行。

例:

输入:
            8
           / \
          6  10
         / \ / \
        5  7 9 11
输出:
8
6 10
5 7 9 11

3. 之字形打印二叉树

请实现一个函数按照之字形顺序打印二叉树,即第一行按照哦从左到右的顺序打印,第二层按照啊从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

例:

输入:
                  1
              /       \
             /         \
           2            3
         /   \        /    \
        4     5      6      7
       / \   / \    / \    / \
      8  9  10 11  12 13  14 15
输出:
1
3 2
4 5 6 7
15 14 13 12 11 10 9 8

思路

  • 对于这三题因为是逐层打印,所以基本思路是广度优先遍历。
  • 题目1: 建立一个队列遍历,从头弹出一个节点打印并从队尾加入其左右节点,直到队列清空。
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(n)
  • 题目2: 为了实现换行,要求记录每层的节点个数。书上采用在上层插入下层节点时计数。我采用每层遍历时,节点不直接加入队列,而是生成新队列,当本层排空时,换行并继续新队列遍历。
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(n)
  • 题目3: 类似题目2,要求Z字形,则每层先打印的节点应当处于下一层的队尾,同时当从右往左打印时,左右节点的打印顺序交换。
    1. 时间复杂度:O(n)
    2. 空间复杂度:O(n)

代码

题目1:时间复杂度:O(n),空间复杂度:O(n)

def print_top_to_bottom(root):
    """    
    :param root: tree root 
    :return: None
    """
    to_print = [root]
    while to_print:
        node = to_print.pop(0)
        if node:
            print(node.val)
            to_print.extend([node.left, node.right])
    return

题目2:时间复杂度:O(n),空间复杂度:O(n)

def print_tree_lines(root):
    """    
    :param root: tree root
    :return: None
    """
    layer = [root]
    next_layer = []
    while layer:
        for node in layer:
            if node:
                print(node.val, end = " ")
                next_layer.extend([node.left, node.right])
        print()
        layer = next_layer
        next_layer = []
    return

题目3:时间复杂度:O(n),空间复杂度:O(n)

def print_tree_lines(root):
    """    
    :param root: tree root 
    :return: None
    """
    layer = [root]
    next_layer = []
    reverse = -1
    while layer:
        for node in layer[::-1]:
            if node:
                print(node.val, end = " ")
                next_layer.extend([node.left, node.right][::-reverse])
        print()
        layer = next_layer
        next_layer = []
        reverse = -reverse
    return

思考

书上用栈(先进后出)实现了题目3,其实等于反转队列。

猜你喜欢

转载自blog.csdn.net/u013908099/article/details/86418299