题目:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
提示:节点总数 <= 1000
解题思路:
刚做完剑指offer32-I和剑指offer32-II,本题和前两天思路大致相同,关键不同在于前两题遍历是从左往右,而本题遍历是奇数层从左往右,偶数层是从右往左。那么就需要用到双端队列,规定奇数层添加到列表尾部,偶数层添加到列表头部。
代码:
import collections
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
queue=collections.deque([root])
out_list=[]
while queue:
length=len(queue)
tmp=collections.deque() #新建列表,用于临时存储当前层打印结果
for _ in range(length):
cur=queue.popleft() #队首元素出队
if len(out_list)%2!=0:tmp.appendleft(cur.val) #奇数层,添加到尾部
else:tmp.append(cur.val) #偶数层,添加到头部
if cur.left:queue.append(cur.left) #若cur左右子节点不为空,则加入deque
if cur.right:queue.append(cur.right)
out_list.append(list(tmp))
return out_list
复杂度:
- 时间复杂度:O(N),N为二叉树的节点数量,即需循环N次,占用O(N);双端队列的队首和队尾的添加和删除操作的时间复杂度均为O(1)。
- 空间复杂度:最差情况下,为满二叉树,最多有N/2个节点同时在deque中,使用O(N)大小的额外空间