之字形打印二叉树

题目:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类

更好理解的思路:在按层遍历二叉树(上一题)的基础上 加个奇数偶数的判断就行

 

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode r) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if (r == null) return res;
        ArrayList<Integer> l = new ArrayList<>();
        LinkedList<TreeNode> q = new LinkedList<>();
        int start = 0;
        q.addLast(r);
        int end = q.size();
        boolean isJi = true;
        while(!q.isEmpty()){
            TreeNode t = q.removeFirst();
            l.add(t.val);
            start++;
            if(t.left!=null) q.addLast(t.left);
            if(t.right!=null) q.addLast(t.right);
            if(start == end){
                start = 0;
                end = q.size();
                if(isJi){
                    res.add(new ArrayList<>(l));
                }else{
                    Collections.reverse(l);
                    res.add(new ArrayList<>(l));
                }
                 isJi = !isJi;
                l.clear();
            }
        }
        return res;
    }

}

 

 

 

思路:leetcode上的最优解,思路就是dfs,而不是一层一层遍历,层数是偶数(0,2,4。。。)时,顺序添加相应的节点的数字,而奇数层时(1,3,5。。),每次插到arraylist最开头,也就是index为0的位置,ArrayList会扩充最前面的长度,就实现了转置

public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res=new ArrayList<>();
        travel(pRoot,res,0);
        return res;
    }
    private void travel(TreeNode curr,ArrayList<ArrayList<Integer>> res,int level){
        if(curr==null)return;
        if(res.size()<=level){
            ArrayList<Integer> newLevel=new ArrayList<>();
            res.add(newLevel);
        }
        ArrayList<Integer> collection=res.get(level);
       if(level%2==0) collection.add(curr.val);
        else collection.add(0,curr.val);
        
        travel(curr.left,res,level+1);
        travel(curr.right,res,level+1);
    }

 

posted @ 2017-04-11 02:47  雪浪snowWave  阅读(127)  评论(0编辑  收藏  举报