剑指 Offer 32 - II. 从上到下打印二叉树 II

DayNightStudy

共 1792字,需浏览 4分钟

 ·

2021-01-30 23:11

剑指 Offer 32 - II. 从上到下打印二叉树 II



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


例如:

给定二叉树: [3,9,20,null,null,15,7],


    3

   / \

  9  20

    /  \

   15   7

返回其层次遍历结果:


[

  [3],

  [9,20],

  [15,7]

]


提示:


节点总数 <= 1000



题目解析

I. 按层打印:题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。


II. 每层打印到一行:将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印。


题目解答


代码展示

方法一:广度优先搜索 层次遍历法(递归)

# Definition for a binary tree node.# class TreeNode:#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = None
class Solution:       def levelOrder(self, root: TreeNode) -> List[List[int]]: ''' 方法一:广度优先搜索 层次遍历法(递归) ''' # step 1:判空 res = [] if not root: return res # step 2:广度优先搜索 level = 0 res=self.bfs(root,0,res) return res
# 方法:广度优先搜索 def bfs(self,root,level,res): # step 1:终止条件判断 if level==len(res): res.append([]) # step 2:先根->左->右 res[level].append(root.val) if root.left: self.bfs(root.left,level+1,res) if root.right: self.bfs(root.right,level+1,res)        return res

    

方法二:队列迭代 (非递归)

# Definition for a binary tree node.# class TreeNode:#     def __init__(self, x):#         self.val = x#         self.left = None#         self.right = None
class Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: ''' 方法二:队列迭代 (非递归) ''' res = [] if not root: return res queue = collections.deque() queue.append(root) while queue: level = [] for _ in range(len(queue)): node = queue.popleft() level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(level)        return res
复杂度计算
  •  时间复杂度:O(N),其中 N 是二叉树的节点数。二叉树的所有节点有且只会被访问一次,因此时间复杂度为 O(N)。

  • -空间复杂度:O(N),当树为平衡二叉树时,最多有N/2个树节点入队,使用 O(N) 大小的额外空间

运行结果

方法一:广度优先搜索 层次遍历法(递归)

方法二:队列迭代 (非递归)



浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报