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

原文地址:https://www.cnblogs.com/Frank-Hong/p/14198311.html