Leetcode 103:二叉树的锯齿形层次遍历(最详细解决方案!!!)

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回锯齿形层次遍历如下:

[
  [3],
  [20,9],
  [15,7]
]

解题思路

参考这篇文章Leetcode 102:二叉树的层次遍历(最详细解决方案!!!)

我们只需要通过设置一个参数i记录我们的层数,如果是偶数层,我们将tmp list反转一下即可。

class Solution:
    def zigzagLevelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        q, result = [root], []
        i = 1
        while any(q):
            tmp = list()
            for _ in range(len(q)):
                node = q.pop(0)
                tmp.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)

            if i%2 == 0:
                tmp.reverse()
            result.append(tmp)
            i += 1
        return result

还有一种做法是通过两个栈,一个栈存储从左向右访问的顺序,另一个栈存储从右向左的访问顺序,两者交替进行。

class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        res = list()
        s1, s2 = [root], list()
    
        while s1 or s2:
            cur = list()
            if s1:
                while s1:
                    node = s1.pop()
                    cur.append(node.val)
                    if node.left:
                        s2.append(node.left)
                    if node.right:
                        s2.append(node.right)
            else:
                while s2:
                    node = s2.pop()
                    cur.append(node.val)
                    if node.right:
                        s1.append(node.right)
                    if node.left:
                        s1.append(node.left)
            res.append(cur)
        return res

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

你可能感兴趣的:(Problems,leetcode解题指南)