题目
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路
- 类似32从上到下打印二叉树,用队列存储二叉树。一个节点出队的同时进数组,然后左右子节点入队。
- 根节点的左右子节点入队后,队列长度=2;记录数组大小,当数组=2时(即左右子节点出队进数组,其左右子节点又进队了,当前队列长度=4),将当前数组作为一行加入结果数组,然后重置队列长度、数组、数组大小。
代码
package nowcoder;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/*
* 60: 从上到下打印二叉树,同一层输出一行
*/
public class TreePrintBSTSplit {
public static void main(String []args) {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
ArrayList<ArrayList<Integer>> result = Print(root);
for(int i=0;i<result.size(); i++) {
for(int j=0;j<result.get(i).size();j++) {
System.out.print(result.get(i).get(j));
}
System.out.println();
}
}
static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
Queue<TreeNode> queue = new LinkedList<>();
ArrayList<ArrayList<Integer>> re = new ArrayList<>();
if (pRoot == null) return re;
queue.add(pRoot);
ArrayList<Integer> arr = new ArrayList<>();
//num记录当前arr元素个数,即这一行已经进来的元素
//end记录这一层该打印的个数,当二者相等则输出一行
int num = 0, end = 1;
while(!queue.isEmpty()) {
TreeNode cur = queue.poll();
arr.add(cur.val);
num++;
if (cur.left != null) {
queue.add(cur.left);
}
if (cur.right != null) {
queue.add(cur.right);
}
if (num == end) {
re.add(arr);
arr = new ArrayList<>();
end = queue.size();
num = 0;
}
}
return re;
}
}