LeetCode103. 二叉树的锯齿形层次遍历

1. 问题

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

例如:

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

    3
   / \
  9  20
    /  \
   15   7
返回锯齿形层次遍历如下:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题思路

还是bfs遍历问题,但是,z字型导致在奇偶数层的读取顺序不一样。
在偶数层,从双向列表右边读,左边添加下一层节点,先添加左子树,再添加右子树;(根节点定义为第0层)
在奇数层,从双向列表左边读,右边添加节点,先添加右子树,再添加左子树。

# 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]]:
        # bfs
        if not root:
            return []
        queue = deque()
        queue.append(root)
        layer = 0
        res = []
        while len(queue)>0:
            size = len(queue)
            tmpres = []
            for i in range(size):
                if layer%2 == 0:
                    node = queue.pop()
                else: 
                    node = queue.popleft()
                tmpres.append(node.val)
                if layer%2 == 0:
                    if node.left:
                        queue.appendleft(node.left)
                    if node.right:
                        queue.appendleft(node.right)
                else:
                    if node.right:
                        queue.append(node.right)
                    if node.left:
                        queue.append(node.left)
            layer += 1
            res.append(tmpres)

        return res

方法2
在奇数层进行反序:

# 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]]:
        # bfs
        if not root:
            return []
        queue = deque()
        queue.append(root)
        layer = 0
        res = []
        while len(queue)>0:
            size = len(queue)
            tmpres = []
            for i in range(size):
                node = queue.popleft()
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
                tmpres.append(node.val)
            if layer%2 == 1:
                tmpres = tmpres[::-1]
            layer += 1
            res.append(tmpres)

        return res
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页