题目描述:将二叉树从上到下按层打印二叉树,同一层结点从左至右输出,每一层输出一行
思路:
1、二叉树的广度优先遍历,使用队列实现
2、二叉树每一层输出一行,需要一个变量来统计每一行的结点数
public ArrayList<ArrayList<Integer>> print(TreeNode pRoot){
if (pRoot==null){
return res;
}
Queue<TreeNode> queue=new LinkedList<>(); //使用队列
queue.offer(pRoot); //加入根结点
int sum=1;//用来代表每一层的结点个数。根结点开始为1
while (!queue.isEmpty()){
ArrayList<Integer> list=new ArrayList<>();
int temp=0;//用来记录每一层的结点个数
while (sum>0){
TreeNode poll = queue.poll();
list.add(poll.val);
if (poll.left!=null){
queue.offer(poll.left);
temp++;
}
if (poll.right!=null){
queue.offer(poll.right);
temp++;
}
sum--; //该层结点数减1.表示该层结点已经被遍历了
}
sum=temp;//将统计的下一层结点个数赋值给sum,进行下一轮的结点遍历
//将每一层得到的结果放入res集合中
res.add(list);
}
return res;
}
题目描述:从上到下打印出二叉树的每个节点,同层节点从左到右打印。
思路:使用队列完成广度优先遍历
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list=new ArrayList<>();
if(root==null){
return list;
}
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode pollNode= queue.poll();
list.add(pollNode.val);
if(pollNode.left!=null){
queue.offer(pollNode.left);
}
if(pollNode.right!=null){
queue.offer(pollNode.right);
}
}
return list;
}
题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推
思路:使用队列实现
1、将每一层的结点都放在各自的集合上。
2、设定一个变量来判断该层是奇数层还是偶数层,如果是偶数层就将集合中的元素进行反转,再加入到集合中
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
if (pRoot==null){
return res;
}
//定义队列
Queue<TreeNode> queue=new LinkedList<>();
//将第一层的结点加入队列中
queue.offer(pRoot);
int sum=1; //定义第一层结点个数
int num=1;//用来代表是奇数层还是偶数层!!!!!
while (!queue.isEmpty()){
ArrayList<Integer> list=new ArrayList<>();
int temp=0;
//遍历每一层
while (sum>0){
//取出队列中的元素,加入到各自的list中
TreeNode poll = queue.poll();
list.add(poll.val);
//统计下一层结点的个数
if (poll.left!=null){
queue.offer(poll.left); //加入队列,下一层结点的个数就+1
temp++;
}
if (poll.right!=null){
queue.offer(poll.right);
temp++;
}
sum--; //该层已经遍历过了,sum就--
}
sum=temp; //将下一层统计的结点个数赋值给sum
//再将list中的结果加入到结果集时,先判断是奇数层还是偶数层
if (num%2==0){ //偶数层 从右到左。就需要将list中的元素进行反转
//利用Collections中的reverse()将元素反转,并将反转的list集合加入到结果集中
Collections.reverse(list);
res.add(list);
}else { //奇数层,从左到右,直接将集合中的元素加入结果集中
res.add(list);
}
num++;//进行下一层的遍历
}
return res;
}