请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
我的想法:
- 之字形打印,其实就是根据行数不同,打印顺序出现变化,奇数行和偶数行的打印顺序不同,因此需要设置一个flag_cnt计数,表示行号的奇偶性
- 使用collections中的双端队列deque(),他的popleft的时间复杂度是O(1)
- temp_deq = deepcopy(tree_deq),这是一个深拷贝,浅拷贝只是传引用,深拷贝是把全部数据赋值到新空间
# 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
tree_deq = collections.deque()
tree_deq.append(root)
flag_cnt = 0
while tree_deq:
temp = []
if flag_cnt%2 == 0:
for i in range(len(tree_deq)):
node = tree_deq.popleft()
temp.append(node.val)
if node.left:
tree_deq.append(node.left)
if node.right:
tree_deq.append(node.right)
else:
# 深拷贝的问题
temp_deq = deepcopy(tree_deq)
for i in range(len(tree_deq)):
h = temp_deq.pop()
temp.append(h.val)
node = tree_deq.popleft()
if node.left:
tree_deq.append(node.left)
if node.right:
tree_deq.append(node.right)
flag_cnt += 1
res.append(temp)
return res
别人的代码思路:偶数层,就粘贴到队列头部,如果是奇数层,就粘贴到队列尾部~
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: tmp.appendleft(node.val) # 偶数层 -> 队列头部
else: tmp.append(node.val) # 奇数层 -> 队列尾部
if node.left: deque.append(node.left)
if node.right: deque.append(node.right)
res.append(list(tmp))
return res