18.之字形顺序打印二叉树

256 阅读1分钟

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

这道题和上面思路一样,只不过因为这个是要左右交替打印,节点依然是按照队列的方式每次进入队列,
只不过在出队列取值的时候,如果是正常打印,就用普通add,如果是从右向左,就用头插。这样一层的数据出队列后用头插法也能让他反过来。

import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
import java.util.Collections;
import java.util.List;

public class Solution {
    ArrayList<ArrayList<Integer>> list= new ArrayList();
    public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        if(pRoot == null){
            return list;
        }
        Queue<TreeNode> q = new LinkedList();
        q.offer(pRoot);
        //不反转
        boolean flag = false;
        
        while(!q.isEmpty()){
            int len = q.size();
            ArrayList<Integer> temp = new ArrayList();
         for(int i = 0;i<len;i++){
            TreeNode node = q.poll();
            if(node.left!=null){
                q.offer(node.left);
            }
            if(node.right!=null){
                q.offer(node.right);
            }
             temp.add(node.val);
           
        }
        //第一次写出错的地方:list反转要放在外面
             if(flag){
               Collections.reverse(temp);
            }
            list.add(temp);
            flag = !flag;
        }
        return list;
        
    }

}