知识点/数据结构:二叉树
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出
注意点
观察数据容器中赛数据的过程
import java.util.ArrayList;
import java.util.Stack;
import java.util.LinkedList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
//和上个题的区别,换了数据结构,也就是数据的容器。
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
//先定义一个存放返回值的容器
ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
//这个容器是存放某一次 某一行的所有数据
ArrayList<Integer> tmp = new ArrayList<Integer>();
//来敲黑板,划重点。用链表来实现队列从左到右的输出
LinkedList<TreeNode> q = new LinkedList<>();
if(pRoot == null) return ret;
//是每次的一个更新,就是第一次的已经放到了目标容器中,下一次会填充几个元素
//《剑指offer》这里的next就是用来跟踪的。
q.add(pRoot);
int now = 1, next = 0;//now表示的是这一行有几个元素,因为第一次填充一个元素,所以初始值是1。
while(!q.isEmpty()) {
//这里就是应该删除链表的第一个节点;同时也把数据保存到了t中。
TreeNode t = q.removeFirst();//删除一个节点,立马需要把输出的节点的内容放到链表中。这里借助链表可以删除头元素的性质。
tmp.add(t.val); //添加到数组中,用来打印
now--;//从这里可以看出now表示队列中的元素个数
if(t.left != null) {
q.add(t.left);
next++;
}
if(t.right != null) {
q.add(t.right);
next++;
}
//此时此刻,需要等到next--操作数次后,直到达到所在行的最后一列。
if(now == 0) {
ret.add(new ArrayList<Integer>(tmp));
tmp.clear();//Clear方法用于清除现有所有的元素
now = next;//这里告诉now下一行需要打印几个元素。然后在下一次while循环的时候
//就可以判断什么时候进入这个if循环。
next = 0;//变为0是为了从左到右继续重新计数下一次添加了几个元素
}
}
return ret;
}
}