1、按行输出
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
解析: 这个和广度优先搜索的区别就是你需要知道那个节点到哪个节点是一行。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/*
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> > listAll = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list =new ArrayList<Integer>();
if(pRoot == null) {
return listAll;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(pRoot);
TreeNode t1 = null;
int left=0;
int right=1;
while(queue.size()>0) {
t1 = queue.poll();
list.add(t1.val);
left++;
if(t1.left!=null) {
queue.offer(t1.left);
}
if(t1.right!=null) {
queue.offer(t1.right);
}
if(left==right) {
listAll.add(list);
left =0;
right =queue.size();
list=new ArrayList<Integer>();
}
}
return listAll;
}
}
这样就行了,用left和right来标记二叉树一行到底多少个节点,可能你会有疑问,怎么知道的,你可以猜想一下,当根节点从队列出来后,先让它的左右节点进去,再计量此时队列的长度,不就知道下一层多长了吗,弄完一层left就重新为0,right就为此时队列的长度,
如果到下一层是多个节点呢?
别忘了我们是从根节点开始的,到这一层的上一层就已经知道这一层的大小了,等这一层全部输出后再判定下一层是多少个。
2、按之字型输出
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解析:
其实这个再上一个的基础上修改,记录是偶层还是奇数层,奇数层直接输出这一层,偶数层就直接把这一层的反转过来输出就行
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> listAll =new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
if(pRoot==null) {
return listAll;
}
Queue< TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(pRoot);
boolean flag = true; //判断奇偶层,第一层奇层
TreeNode t1=null;
int left =0;
int right =1;
while(queue.size()>0) {
t1 = queue.poll();
list.add(t1.val);
left++;
if(t1.left!=null) {
queue.offer(t1.left);
}
if(t1.right!=null) {
queue.offer(t1.right);
}
if(left==right) {
left=0;
right = queue.size();
if(flag) { //奇层不变
flag= false;
}else { //偶层反转
Collections.reverse(list);//反转集合里的数据
flag =true;
}
listAll.add(list);
list=new ArrayList<Integer>();
}
}
return listAll;
}