LeetCode 103. 二叉树的锯齿形层序遍历 dfs

题目链接

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]

猜你喜欢

转载自blog.csdn.net/weixin_44123362/article/details/130257221