1. 程式人生 > >LeetCode:二叉樹的鋸齒形層次遍歷【103】

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;
    }
}