LeetCode:二叉树的锯齿形层次遍历【103】

 LeetCode:二叉树的锯齿形层次遍历【103】

题目描述

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

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

    3
   / \
  9  20
    /  \
   15   7

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

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

题目分析

  层次遍历,应该很容易想到BFS(宽度优先搜索算法),此处是锯齿形,即一层是从左往右,下一层就是从右往左

  解决办法是每一层都按照从左往右遍历,只是如果是偶数层的话,当遍历完该层后执行一层逆序即可

  这里有一个很好用的集合方法,快速逆序集合:

Collections.reverse(line);

Java题解

 
package tree;

import java.util.*;

public class ZigzagLevelOrder_103 {
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ans = new ArrayList<>();
        List<Integer> line = new ArrayList<>();

        if(root == null)
            return ans;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);

        line.add(root.val);
        ans.add(line);
        line =  new ArrayList<>();

        int size = queue.size();
        int flag = 1;
        while(!queue.isEmpty())
        {
            TreeNode tmp  = queue.poll();
            if(tmp.left!=null)
            {
                queue.add(tmp.left);
                line.add(tmp.left.val);
            }
            if(tmp.right!=null)
            {
                queue.add(tmp.right);
                line.add(tmp.right.val);
            }

            size--;
            if(size==0&&line.size()>0)
            {
                if(flag==1)
                {
                    Collections.reverse(line);
                    flag=0;
                }else
                    flag=1;
                size=queue.size();
                ans.add(line);
                line = new ArrayList<>();
            }
        }
        return ans;
    }
}

  

posted @ 2018-10-18 10:25  子烁爱学习  阅读(518)  评论(0编辑  收藏  举报