LeetCode 103. BTree Zigzag Level Order Traversal

简介: 给定二叉树,返回其节点值的Z字形级别遍历。 (即,从左到右,然后从右到左进行下一级别并在之间交替)。

v2-5936daf6d4b10803ed706ec48e6c00c8_1440w.jpg

Description



Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:


Given binary tree [3,9,20,null,null,15,7],


3
   / \
  9  20
    /  \
   15   7


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


描述



给定二叉树,返回其节点值的Z字形级别遍历。 (即,从左到右,然后从右到左进行下一级别并在之间交替)。


思路



  • 此题目同上一题102题思路完全一致,我们只需要加一个判断来确定当前层是否需要反转即可.


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2018-12-29 18:55:05
# @Last Modified by:   何睿
# @Last Modified time: 2018-12-29 19:20:04
# 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):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        # 如果子树为空,则直接返回空
        if not root:
            return []
        # 当前遍历层的所有节点,下一层将遍历的所有节点
        currnode, nextnode, res = [root], [], []
        # 数组的起始位置,数组的结束位置,当前层数的所有节点个数
        start, end, count = 0, 0, 1
        # 循环条件,只有当前层还有节点需要遍历才执行
        reverse = False
        while currnode:
            # 索引开始地址,索引结束地址
            start, end = 0, count
            # 当前层所有节点的值,count重置为0
            level, count = [], 0
            for i in range(start, end):
                # 如果当前节点有左节点
                if currnode[i].left:
                    # 左节点将在下一层遍历,放入nextnode数组
                    nextnode.append(currnode[i].left)
                    # 下一层个数自增一次
                    count += 1
                # 如果当前节点有右节点
                if currnode[i].right:
                    # 右节点将在下一层遍历,放入nextnode数组
                    nextnode.append(currnode[i].right)
                    # 下一层个数自增一次
                    count += 1
                # 存储当前节点的值
                level.append(currnode[i].val)
            # 结果数组存储当前层的所有值
            # 如果需要反转,则对结果进行反转
            if reverse:
                level.reverse()
                # 下次不需要反转,重置为False
                reverse = False
            elif not reverse:
                reverse = True
            res.append(level)
            # currnode置为下一层,nextnode重置为空
            currnode, nextnode = nextnode, []
        return res
  • 以下用python的队列实现了一遍


# -*- coding: utf-8 -*-
# @Author:             何睿
# @Create Date:        2018-12-29 18:55:05
# @Last Modified by:   何睿
# @Last Modified time: 2018-12-29 19:20:04
# Definition for a binary tree node.
from collections import deque
class Solution:
    def zigzagLevelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        # 使用队列实现
        if not root:
            return []
        # 是否需要反转,存储结果,队列
        reverse, res, queue = False, [], deque()
        queue.append(root)
        # 循环条件:队列中还有节点
        while queue:
            nums, level = len(queue), []
            # 遍历当前层的所有节点
            for _ in range(0, nums):
                current = queue.popleft()
                # 左子树
                if current.left:
                    queue.append(current.left)
                # 右子树
                if current.right:
                    queue.append(current.right)
                level.append(current.val)
            # 是否需要反转
            if reverse:
                level.reverse()
                reverse = False
            elif not reverse:
                reverse = True
            res.append(level)
        return res


源代码文件在这里.


目录
相关文章
Leetcode Binary Tree Postorder Traversal(面试题推荐)
非递后续归遍历二叉树,肯定得用到栈。先序遍历很好写,但后续遍历就不是那么容易了。 只需要设置个指针pre,指向最后输出的那个节点就行了,只要判断cur指针指向的是上次输出节点的父节点,且cur无其他未遍历的节点,这个时候就把cur节点输出即可,然后更改pre。原理是要遍历当前节点,其所有子节点都必须遍历完,因为肯定是先左后右,所以只需一个指针保持前一次输出的结果即可。
51 0
LeetCode 429. N-ary Tree Level Order Traversal
给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。
85 0
LeetCode 429. N-ary Tree Level Order Traversal
LeetCode 145. Binary Tree Postorder Traversal
给定一个二叉树,返回它的后序遍历。
69 0
LeetCode 145. Binary Tree Postorder Traversal
|
存储
LeetCode 107. Binary Tree Level Order Traversal II
给定二叉树,返回其节点值的自下而上级别顺序遍历。 (即,从左到右,逐下而上)。
79 0
LeetCode 107. Binary Tree Level Order Traversal II
LeetCode 102. 二叉树的层序遍历 Binary Tree Level Order Traversal
LeetCode 102. 二叉树的层序遍历 Binary Tree Level Order Traversal
LeetCode contest 183 5376. 非递增顺序的最小子序列 Minimum Subsequence in Non-Increasing Order
LeetCode contest 183 5376. 非递增顺序的最小子序列 Minimum Subsequence in Non-Increasing Order
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
56 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
113 2
|
18天前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
16 1