Leetcode刷题Python103. 二叉树的锯齿形层序遍历

Posted Better Bench

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题Python103. 二叉树的锯齿形层序遍历相关的知识,希望对你有一定的参考价值。

1 题目

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

2 解析

为了满足题目要求的返回值为「先从左往右,再从右往左」交替输出的锯齿形,我们可以利用「双端队列」的数据结构来维护当前层节点值输出的顺序。

双端队列是一个可以在队列任意一端插入元素的队列。在广度优先搜索遍历当前层节点拓展下一层节点的时候我们仍然从左往右按顺序拓展,但是对当前层节点的存储我们维护一个变量 flag记录是从左至右还是从右至左的:

  • 如果从左至右,我们每次将被遍历到的元素插入至双端队列的末尾。

  • 如果从右至左,我们每次将被遍历到的元素插入至双端队列的头部。

当遍历结束的时候我们就得到了答案数组。

3 Python实现

def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
    
    res = []
    q =deque([root])
    flag = True
    while q and q[0]:
        n = len(q)
        tmp = []
        for _ in range(n):
            node = q.popleft()
            tmp.append(node.val)
            if node.left:
                q.append(node.left)
            if node.right:
                q.append(node.right)
        if  flag:
                res.append(tmp)
        else:
            tmp.reverse()
            res.append(tmp)
        flag = not flag
    return res

以上是关于Leetcode刷题Python103. 二叉树的锯齿形层序遍历的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题模版:101 - 110

LeetCode刷题模版:101 - 110

python-leetcode103-树的宽度遍历二叉树的锯齿形层次遍历

LeetCode第103题—二叉树的锯齿形层序遍历—Python实现

Leetcode刷题Python104. 二叉树的最大深度

Leetcode刷题Python94. 二叉树的中序遍历