# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# 解法一:前序遍历,记录每层从左到右的节点,然后进行翻转
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
if root == None:
return []
res = {
}
level = 1
def PreOrder(root, level):
if level not in res:
res[level]=[root.val]
else:
res[level].append(root.val)
if root.left:
PreOrder(root.left, level+1)
if root.right:
PreOrder(root.right, level+1)
PreOrder(root, 1)
n = []
for k,v in res.items():
n_ = []
if k%2 ==0:
n.append(v[::-1])
else:
n.append(v)
return n
参考官方题解103,可以设置一个双端队列,可以在队列任意一端插入元素,从而在遍历二叉树时,达到从左到右和从右到左遍历的效果。
# 解法二:双端队列
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
if root == None:
return []
bi_queue = [root]
res = []
level = 1
while bi_queue:
q_len = len(bi_queue)
cur_list = []
for i in range(q_len):
if level % 2 != 0: #奇数层
cur = bi_queue.pop(-1)
cur_list.append(cur.val)
if (level+1) % 2 == 0: #偶数层
if cur.left:
bi_queue.insert(0,cur.left)
if cur.right:
bi_queue.insert(0,cur.right)
else: #奇数层
if cur.right:
bi_queue.append(cur.right)
if cur.left:
bi_queue.append(cur.left)
else: #偶数层
cur = bi_queue.pop(0)
cur_list.append(cur.val)
if (level+1) % 2 == 0: #偶数层
if cur.left:
bi_queue.insert(0,cur.left)
if cur.right:
bi_queue.insert(0,cur.right)
else: #奇数层
if cur.right:
bi_queue.append(cur.right)
if cur.left:
bi_queue.append(cur.left)
res.append(cur_list)
level += 1
return res
# print(res)