题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
更容易理解的思路,用计数器的方式 和队列 计数每次出队的节点数 等于这一层的节点数时 表明本层遍历完了
import java.util.*; public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode r) { ArrayList<ArrayList<Integer> > res = new ArrayList<>(); if (r==null) return res; //保存当前层的节点值 ArrayList<Integer> list = new ArrayList<>(); //保存当前层的节点 LinkedList<TreeNode> q = new LinkedList<>(); //初始化 int start = 0; //根节点只有1个 int end = 1; q.addLast(r); while(!q.isEmpty()){ TreeNode t = q.removeFirst(); list.add(t.val); //从队列出队一个 就加1; 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(); res.add(new ArrayList<>(list)); list.clear(); } } return res; } }
思路:设置两个指针,一个指向当前层最右,另一个指向现在遍历的节点,,基本就是bfs。。。加一个换行判断
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { if(pRoot==null) return new ArrayList<>(); TreeNode last=pRoot; TreeNode nlast=null; LinkedList<TreeNode> queue=new LinkedList<TreeNode>(); ArrayList<Integer> temp=new ArrayList<Integer>(); ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>(); queue.add(pRoot); while(!queue.isEmpty()){ TreeNode cur=queue.poll(); temp.add(cur.val); if(cur.left!=null){ queue.add(cur.left); nlast=cur.left; } if(cur.right!=null){ queue.add(cur.right); nlast=cur.right; } if(cur==last){ res.add(temp); temp=new ArrayList<Integer>(); last=nlast; } } return res; }