跳转至

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

问题描述#

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

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


    3
   / \
  9  20
    /  \
   15   7

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


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

解题思路#

双栈

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []

        ltr, rtl = [root], []
        ans = []
        while ltr or rtl:
            ans.append([])
            if ltr:
                while ltr:
                    node = ltr.pop()
                    ans[-1].append(node.val)
                    if node.left:
                        rtl.append(node.left)
                    if node.right:
                        rtl.append(node.right)
            else:
                while rtl:
                    node = rtl.pop()
                    ans[-1].append(node.val)
                    if node.right:
                        ltr.append(node.right)
                    if node.left:
                        ltr.append(node.left)
        return ans

双队列

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from collections import deque

class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []

        q = deque([root])
        f = False
        ans = []
        while q:
            n = len(q)
            t = deque([])
            for _ in range(n):
                node = q.popleft()
                if f:
                    t.appendleft(node.val)
                else:
                    t.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            f = not f
            ans.append([])
            while t:
                ans[-1].append(t.popleft())
        return ans
返回顶部

在手机上阅读