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

    题目链接 : https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/

    题目描述:

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

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

        3
       / 
      9  20
        /  
       15   7
    

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

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

    思路:

    上一题一样102. 二叉树的层次遍历

    思路一:BFS

    思路二:递归

    代码:

    # 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 []
            res = []
            cur_level = [root]
            depth = 0
            while cur_level:
                tmp = []
                next_level = []
                for node in cur_level:
                    tmp.append(node.val)
                    if node.left:
                        next_level.append(node.left)
                    if node.right:
                        next_level.append(node.right)
                if depth % 2 == 1:
                    res.append(tmp[::-1])
                else:
                    res.append(tmp)
                depth += 1
                cur_level = next_level
            return res
            
    

    java

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            if (root == null) return res;
            Deque<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            int depth = 0;
            while (!queue.isEmpty()) {
                List<Integer> tmp = new LinkedList<>();
                int cnt = queue.size();
                for (int i = 0; i < cnt; i++) {
                    TreeNode node = queue.poll();
                    // System.out.println(node.val);
                    if (depth % 2 == 0) tmp.add(node.val);
                    else tmp.add(0, node.val);
                    if (node.left != null) queue.add(node.left);
                    if (node.right != null) queue.add(node.right);
                }
                res.add(tmp);
                depth++;
            }
            return res;
        }
    }
    

    思路二:

    # 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]]:
            res = []
            
            def helper(root, depth):
                if not root: return 
                if len(res) == depth:
                    res.append([])
                if depth % 2 == 0:res[depth].append(root.val)
                else: res[depth].insert(0, root.val)
                helper(root.left, depth + 1)
                helper(root.right, depth + 1)
            helper(root, 0)
            return res
    

    java

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            helper(res, root, 0);
            return res;
    
        }
    
        private void helper(List<List<Integer>> res, TreeNode root, int depth) {
            if (root == null) return;
            if (res.size() == depth) res.add(new LinkedList<>());
            if (depth % 2 == 0) res.get(depth).add(root.val);
            else res.get(depth).add(0, root.val);
            helper(res, root.left, depth + 1);
            helper(res, root.right, depth + 1);
        }
    }
    
  • 相关阅读:
    【反射】Java反射机制
    Composer教程之常用命令
    Composer教程之基础用法
    Composer教程之初识Composer
    Composer 的结构详解
    现代 PHP 新特性系列(七) —— 内置的 HTTP 服务器
    现代 PHP 新特性系列(一) —— 命名空间
    现代 PHP 新特性系列(二) —— 善用接口
    现代 PHP 新特性系列(三) —— Trait 概览
    现代 PHP 新特性系列(四) —— 生成器的创建和使用
  • 原文地址:https://www.cnblogs.com/powercai/p/11093532.html
Copyright © 2011-2022 走看看