记录刷题的过程。牛客和力扣中都有相关题目,这里以牛客的题目描述为主。该系列默认采用python语言。
1、问题描述:
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
2、数据结构:
二叉树、队列
3、题解:
如图:
设置两个队列,分别存放从左到右打印节点。每个循环,若deque1不为空,则每次取出第一个节点,并且把取出节点的左、右节点依次放到deque2中;若deque2不为空,则每次取出第一个节点,并且把取出节点的左、右节点依次放到deque2中。因为队列是先入先出,所以,deque1从左到右,deque2从左到右。
下面是和之字打印一样的套路
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回二维列表[[1,2],[4,5]]
def Print(self, pRoot):
# write code here
if not pRoot:
return []
deque1 ,deque2 = [pRoot],[]
res = []
while deque1 or deque2:
if deque1:
ptemp = []
while deque1:
temp_res = deque1.pop(0)
ptemp.append(temp_res.val)
if temp_res.left:
deque2.append(temp_res.left)
if temp_res.right:
deque2.append(temp_res.right)
res.append(ptemp)
if deque2:
ptemp = []
while deque2:
temp_res = deque2.pop(0)
ptemp.append(temp_res.val)
if temp_res.left:
deque1.append(temp_res.left)
if temp_res.right:
deque1.append(temp_res.right)
res.append(ptemp)
return res
或者直接用BFS去做:
BFS模板见牛客-剑指offer系列题解:从上往下打印二叉树
注意区别,此题是二维数组,链接中的题是一维数组。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回二维列表[[1,2],[4,5]]
def Print(self, pRoot):
# write code here
#模板一 不需要每次记录size
if not pRoot:
return []
import collections
deque = collections.deque()
deque.append(pRoot)
res = []
while deque:
temp = []
size = len(deque)
for _ in range(size):
node = deque.popleft()
temp.append(node.val)
if node.left:
deque.append(node.left)
if node.right:
deque.append(node.right)
res.append(temp)
return res
4、复杂度分析:
时间复杂度:O(N)
空间复杂度:O(N)