层序遍历+链表翻转+标志位
1、根据题目意思就是要一层一层的获取二叉树,一层是正着来,一层是反着来,即Z字型。
想法:先层序遍历吧,肯定要一层一层来嘛!
然后的想法:一下从左到右,下一个从右到左,怎么来搞呢?emmmmm,标志位试一下哇!
flag=0 从左到右打印就是正常的遍历就可以了哇,然后就把flag=1
flag=1 链表就要反转,此时我查了一下ArrayList里面有一个set函数,可以把链表翻转,重新来个函数,当标志位为1,就翻转。
剩下的就是细节处理,可以看代码了!!!
import java.util.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer> > res = new ArrayList<ArrayList<Integer> >(); if(pRoot == null){ return res; } Queue<TreeNode> rear = new LinkedList<>(); rear.add(pRoot); int flag = 0; while( !rear.isEmpty() ){ int size = rear.size(); ArrayList<Integer> list = new ArrayList<>(); while(size-- > 0){ TreeNode temp = rear.poll(); list.add(temp.val); if(temp.left != null){ rear.add(temp.left); } if(temp.right != null){ rear.add(temp.right); } } if(flag == 0){ flag = 1; }else if(flag == 1){ Reverse(list); flag = 0; } res.add(list); } return res; } public ArrayList<Integer> Reverse(ArrayList<Integer> list){ int top = 0; int end = list.size()-1; while(top < end){ int temp = list.get(top); list.set(top,list.get(end)); list.set(end,temp); top++; end--; } return list; } }