今天我们来做一道LeetCode上的题目,原题链接:剑指 Offer 32 - 从上到下打印二叉树 III
题目描述
- 请实现一个函数按照“之”字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
- 例如:
- 给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
- 返回:
[
[3],
[20,9],
[15,7]
]
- 提示:
节点总数 <= 1000
思路分析
- 二叉树遍历使用双端队列:collections.deque()
- 结果保存使用有序词典:collections.OrderedDict()
- “之”字返回策略:偶数行从左到右追加,奇数行从右向左追加
代码
# Python
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def levelOrder(self, root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
if not root: return []
res_dict, queue = collections.OrderedDict(), collections.deque()
level = 0
queue.append((root, level))
while queue:
node, level = queue.popleft()
if level in res_dict:
res_dict[level].append(node.val) if level % 2 == 0 else res_dict[level].insert(0, node.val)
else:
res_dict[level] = [node.val]
level += 1
if node.left: queue.append((node.left, level))
if node.right: queue.append((node.right, level))
return res_dict.values()
总结
- collections.deque()
- append():追加函数
- popleft():从头部取数据
- collections.OrderedDict()
- values():返回值数组
附录
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情