zoukankan      html  css  js  c++  java
  • LeetCode 103. 二叉树的锯齿形层次遍历

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

    Difficulty: 中等

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

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

        3
       / 
      9  20
        /  
       15   7
    

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

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

    Solution

    Language: 全部题目

    解法一:

    这道题是层序遍历的变种,只不过对队列的操作要稍微复杂一点,需要依次对队列的两端做添加和移除操作。

    # 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]]:
            if not root: return []
            queue, res, flag = deque([root]), [], 1  # flag控制往队列添加元素的方式和取出元素的方式
    ​
            while queue:
                curLevel, size = [], len(queue)
                for i in range(size):
                    if flag == -1: # flag为-1,先遍历左子树后遍历右子数,往队列的添加方式为appendleft
                        node = queue.pop()
                        if node.right:
                            queue.appendleft(node.right)
                        if node.left:
                            queue.appendleft(node.left)
                    else:
                        node = queue.popleft()
                        if node.left:
                            queue.append(node.left)
                        if node.right:
                            queue.append(node.right)
                    curLevel.append(node.val)
                flag = flag * -1
                res.append(curLevel)
            return res
    

    解法二:

    # Definition for a binary tree node.
    # class TreeNode:
    #     def __init__(self, val=0, left=None, right=None):
    #         self.val = val
    #         self.left = left
    #         self.right = right
    class Solution:
        def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
            if not root:
                return []
            queue, res = [root], []
            while queue:
                curLevel, size = [], len(queue)
                for i in range(size):
                    node = queue.pop(0)
                    curLevel.append(node.val)
                    if node.left:
                        queue.append(node.left)
                    if node.right:
                        queue.append(node.right)
                res.append(curLevel)
            z = []
            for i, v in enumerate(res):
                if i % 2 != 0:
                    z.append(v[::-1])
                else:
                    z.append(v)
            return z
    
  • 相关阅读:
    Pyhont 高阶函数
    Python 函数式编程
    Python 递归函数
    Python 函数的参数定义
    Lniux学习-AWK使用
    Windows10 下 VirtualBox6 中 Centos8 无法安装"增强功能"
    Linux学习-Shell-系统启动过程与执行方式
    接口测试-工具介绍
    Linux学习-Sed 命令
    Linux学习-命令行参数、函数
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14041232.html
Copyright © 2011-2022 走看看