题目链接
https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/
思路
一次dfs记录每个节点所在层level和其编号index,并将其添加到列表中。
然后对所有节点进行排序,首先对节点的level从小到大进行排序,level相同时,如果是奇数层,则按照index从大到小进行排序,如果是偶数层,则按照index从小到大进行排序
代码
# Definition for a binary tree node.
class TreeNode:
def __init__(self, val=0, left=None, right=None, index=0, level=0):
self.val = val
self.left = left
self.right = right
self.index = index
self.level = level
class Solution:
def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
nodeList = []
def cmp(a, b):
if a.level != b.level:
return a.level - b.level
if a.level % 2 == 0:
return a.index - b.index
else:
return b.index - a.index
def dfs(root, index, level):
if not root:
return
root.level = level
root.index = index
nodeList.append(root)
if root.left:
dfs(root.left, 2 * index + 1, level + 1)
if root.right:
dfs(root.right, 2 * index + 2, level + 1)
if not root:
return []
dfs(root, 0, 0)
nodeList.sort(key = functools.cmp_to_key(cmp))
resList = [[] for i in range(2005)]
maxLevel = 0
for i in range(len(nodeList)):
level = nodeList[i].level
maxLevel = max(maxLevel, level)
resList[level].append(nodeList[i].val)
return resList[:maxLevel + 1]