题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
题解
知识点
二叉树层次遍历变形,借助队列
//建立队列
Queue<TreeNode> queue = new LinkedList<>();
//入队
queue.add(p);
//出队
queue.remove();
//当前队列中元素个数
queue.size();
//空队
queue.isEmpty();
注1:设置两个变量
每一层元素个数:n,初始时n=1(第一层节点个数),下一层节点个数为计数器count=n时(即上一层节点已经全部遍历后)队列中元素个数.
每一层已经遍历的节点个数计数器:count,每遍历一个点,计数器+1,当计数器的值与当层节点个数相等时,计数器重置为0
注2:返回数据类型为ArrayList<ArrayList<Integer>>
,将每一行看作一个ArrayList<Integer>
,每一行存入二维的时候,需要重新new一遍,防止下一行操作的时候改变下一行的值。
方法(队列)
import java.util.ArrayList;
import java.util.*;
/*
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<>();
if(pRoot==null){
return listall;
}
TreeNode p = pRoot;
int n = 1;//每一层的个数
int count = 0;//计数器,当count=n时,将当前list存在listall中
//建立队列
Queue<TreeNode> queue = new LinkedList<>();
//入队
queue.add(p);
//队列不空时循环
while(!queue.isEmpty()){
//当前点出队,并放入list中
p = queue.remove();//出队
list.add(p.val);
count++;
if(p.left!=null){
queue.add(p.left);
}
if(p.right!=null){
queue.add(p.right);
}
if(count==n){
n = queue.size();//当前队列中元素个数,即下一层的节点总数
listall.add(list);
list = new ArrayList<>(); //注意!!!
count = 0;
}
}
return listall;
}
}
递归法
链接:https://www.nowcoder.com/questionTerminal/445c44d982d04483b04a54f298796288?f=discussion
来源:牛客网
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
depth(pRoot, 1, list);
return list;
}
private void depth(TreeNode root, int depth, ArrayList<ArrayList<Integer>> list) {
if(root == null) return;
if(depth > list.size())
list.add(new ArrayList<Integer>());
list.get(depth -1).add(root.val);
depth(root.left, depth + 1, list);
depth(root.right, depth + 1, list);
}
}