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

    题目

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

    例如:

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

    返回锯齿形层序遍历如下:
    [
    [3],
    [20,9],
    [15,7]
    ]

    分析

    实际上就是层序遍历的问题,类似问题有求二叉树的层序遍历。将每层的遍历结果装入List中,偶数层的遍历结果最后反转过来即可。使用LinkedList保存信息,LinkedList实现了接口Queue,可以当队列用。关键点在于如何将不同层的节点区分开来。这里我们用一个变量n来记录每一层的节点个数,遍历完一层的n个节点后再一次执行while循环

    代码

    class Solution {
        public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
            LinkedList<TreeNode> list=new LinkedList<>();
            List<List<Integer>> res=new ArrayList<>();
            if(root==null) return res;
            list.add(root);
            while(list.size()!=0){
                int n=list.size();//每层的节点个数
                ArrayList<Integer> level=new ArrayList<>();
                for(int i=0;i<n;++i){
                    TreeNode cur=list.removeFirst();
                    if(cur.left!=null) list.add(cur.left);
                    if(cur.right!=null) list.add(cur.right);
                    level.add(cur.val);
                }
                res.add(level);
            }
            //将相应层的遍历结果反转
            for(int i=0;i<res.size();i++){
                if(i%2==1) {
                    List<Integer> temp=res.get(i);
                    Collections.reverse(temp);
                    res.set(i,temp);
                }
            }
            return res;
        }
    }
    

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

  • 相关阅读:
    vb.net的数据类型
    PHP常用函数
    399. Evaluate Division
    329. Longest Increasing Path in a Matrix
    415. Add Strings
    463 Island Perimeter
    400. Nth Digit
    401. Binary Watch
    391. Perfect Rectangle
    406. Queue Reconstruction by Height
  • 原文地址:https://www.cnblogs.com/Frank-Hong/p/14198311.html
Copyright © 2011-2022 走看看