题目描述(和上一题一样,少了reverse判断)
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
方法:广度优先遍历
package test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class TreeNode {
int val;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
class Solution {
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if(pRoot==null){
return result; //这里要求返回result而不是null
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(pRoot);
while(!queue.isEmpty()){
ArrayList<Integer> list = new ArrayList<>();
int size = queue.size();// 这个地方真是没有想到啊,queue是变化的,必须在for循环之前定义queue.size(),错了两回了!
for(int i=0;i<size;i++){
TreeNode temp = queue.poll();
list.add(temp.val);
if(temp.left!=null)
queue.add(temp.left);
if(temp.right!=null)
queue.add(temp.right);
}
result.add(list);
}
return result;
}
}
public class Main {
public static void main(String[] args) {
TreeNode head=new TreeNode(1);//849
TreeNode second=new TreeNode(2);//850
TreeNode three=new TreeNode(3);//851
TreeNode four=new TreeNode(4);//852
TreeNode five=new TreeNode(5);//853
TreeNode six=new TreeNode(6);//854
TreeNode seven=new TreeNode(7);//855
head.right=three;
head.left=second;
second.right=five;
second.left=four;
three.right=seven;
three.left=six;
Solution p = new Solution();
ArrayList<ArrayList<Integer>> list = p.Print(head);
System.out.print("广度优先遍历使用栈:"+list);
}
}
再来复习一下原始广度优先遍历,上一题就是在这个的基础上加了一个for循环。
package test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
class TreeNode {
int val;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
class Solution {
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 temp = queue.poll();
list.add(temp.val);//给list复制还是要用.val
if(temp.left!=null)
queue.offer(temp.left);
if(temp.right!=null)
queue.offer(temp.right);
}
return list;
}
}
public class Main {
public static void main(String[] args) {
TreeNode head=new TreeNode(1);//849
TreeNode second=new TreeNode(2);//850
TreeNode three=new TreeNode(3);//851
TreeNode four=new TreeNode(4);//852
TreeNode five=new TreeNode(5);//853
TreeNode six=new TreeNode(6);//854
TreeNode seven=new TreeNode(7);//855
head.right=three;
head.left=second;
second.right=five;
second.left=four;
three.right=seven;
three.left=six;
Solution p = new Solution();
ArrayList<Integer> list = p.PrintFromTopToBottom(head);
System.out.println(list);
}
}