涉及到二叉树的题目一般用stack实现bfs或者dfs,最好避免迭代法。
题目分层打印,与从左到右打印类似,依然使用bfs。之字形打印,只需要一个判定语句区分奇偶层然后用collections.deque双向队列实现快速的逆向打印。
关于collections.deque的用法,见链接
写代码思维练习:
- 确定函数的输出res:list[list]
- 需要那些变量:一个deque用来储存搜索节点,另一个deque用来储存每层的打印列表
- 主体while循环的结束条件: deque为空,也就是整个树遍历完毕时
- while循环中需要处理的事项: 1)deque pop本层的node。 2)储存打印值(分奇偶)3)deque中存入所有本层节点的左右节点。
代码如下
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, deque = [], collections.deque([root])
while deque:
tmp = collections.deque()
for _ in range(len(deque)):
node = deque.popleft()
if len(res)%2==0: tmp.append(node.val)
else: tmp.appendleft(node.val)
if node.left: deque.append(node.left)
if node.right:deque.append(node.right)
res.append(list(tmp))
return res
注意deque最后要cast回list()再append进res