Leetcode 103. Binary Tree Zigzag Level Order Traversal 二叉树Zigzag遍历 解题报告

来源:互联网 发布:win10 软件 卸载 残留 编辑:程序博客网 时间:2024/05/16 00:57

1 解题思想

首先这道题和
Leetcode 102. Binary Tree Level Order Traversal 二叉树按层遍历 解题报告
很接近,Zigzag同样是按层遍历,但是区别是对于高度为奇数(从0开始计数的话,则是第1 3 5 7)的层,当层的遍历需要反过来。

做法:
1、采用102题目中的方式,无论是DFS还是BFS都行
2、完成1后,对所有奇数层进行翻转

这题的写法和102不太相同,大家都可以参考

2 原题

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   7return its zigzag level order traversal as:[  [3],  [20,9],  [15

3 AC解

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    /**     * 采用广度遍历BFS的方式,在维护访问队列的同时维护一个层数的队列     * 当层数发生改变时,将当层的结果加入到结果集当中,此时看层数,如果层数是奇数(从0开始),则先翻转再加入就可以     */    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {        List<List<Integer>> result = new ArrayList<List<Integer>>();        if(root==null) return result;        Queue<Integer> layers = new LinkedList<Integer>();        Queue<TreeNode> nodes = new LinkedList<TreeNode>();        nodes.add(root);        layers.add(0);        int lastLayer = 0;        List<Integer> tmp = new ArrayList<Integer>();        TreeNode node = null;        int layer = 0;        while(nodes.isEmpty() == false){            node = nodes.poll();            layer = layers.poll();            if(layer != lastLayer){                if(lastLayer %2 == 1){                    Collections.reverse(tmp);                }                result.add(tmp);                tmp = new ArrayList<Integer>();            }            tmp.add(node.val);            lastLayer = layer;            if(node.left != null) {                nodes.add(node.left);                layers.add(layer+1);            }            if(node.right != null) {                nodes.add(node.right);                layers.add(layer+1);            }        }        if(lastLayer %2 == 1){            Collections.reverse(tmp);        }        result.add(tmp);        return result;    }}
0 0