一 剑指offer上规定了返回值为ArrayList<ArrayList<Integer>>类型,做法与层序遍历二叉树一样,但是需要按行打印出来,所以还是需要两个变量每一个last表示本层最后一个节点,nLast表示下一层最后一个节点,每次当前节点遍历到last就说明该换行了,然后将本行的节点值保存在ArrayList中,最后将每层的ArrayList保存到大的ArrayList中。换行之后,last=nLast,就可以继续下一行的打印过程,nLast一直跟踪记录宽度优先队列中最新加入的节点即可。
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
if(pRoot == null){
return res;
}
TreeNode last = pRoot;
TreeNode nLast = null;
ArrayList<Integer> list = new ArrayList<Integer>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(pRoot);
while(!queue.isEmpty()){
pRoot = queue.poll();
list.add(pRoot.val);
if(pRoot.left != null){
queue.offer(pRoot.left);
nLast = pRoot.left;
}
if(pRoot.right != null){
queue.offer(pRoot.right);
nLast = pRoot.right;
}
if(pRoot == last){
res.add(list);
last = nLast;
list = new ArrayList<Integer>();
}
}
return res;
}
}
二 返回值为空时,用System.out.print()直接打印
package OfferTest;
import java.util.LinkedList;
import java.util.Queue;
//按层打印,返回值为void版本
public class NoSixty {
public static void printByLevel(TreeNode head){
if(head == null)
return;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
int level = 1;
TreeNode last = head;
TreeNode nLast = null;
queue.offer(head);
System.out.print("level" + (level++) + ":");
while(!queue.isEmpty()){
head = queue.poll();
System.out.print(head.val + " ");
if(head.left != null){
nLast = head.left;
queue.offer(head.left);
}
if(head.right != null){
nLast = head.right;
queue.offer(head.right);
}
if(head == last && !queue.isEmpty()){
System.out.print("\nlevel" + (level++) + ":");
last = nLast;
}
}
System.out.println();
}
public static void main(String[] args){
TreeNode node = new TreeNode(1);
node.left = new TreeNode(2);
node.right = new TreeNode(3);
node.left.left = new TreeNode(4);
node.right.left = new TreeNode(5);
node.right.right = new TreeNode(6);
node.right.left.left = new TreeNode(7);
node.right.left.right = new TreeNode(8);
printByLevel(node);
}
}