package class07;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* 二叉树的层序遍历 II
*/
//public class Code01_BinaryTreeLevelOrderTraversalII {
public class Code01_BinaryTreeLevelOrderTraversal_v02 {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
/**
* 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
*
* @param root 二叉树的根节点
* @return ans:List<List<Integer>> ans,list中嵌套list<Integer>。
*/
public static List<List<Integer>> levelOrderBottom(TreeNode root) {
//也就是如果树有3层,那么ans的size就是3,ans中就有3个List<Integer>。
List<List<Integer>> ans = new LinkedList<>();
if (root == null) {
return ans;
}
//定义一个队列,用来循环添加树节点。
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);//先将根节点添加到队列。
while (!queue.isEmpty()) {//只要队列不是空,就继续。
int size = queue.size();
//定义一个链表,用来装每一层的所有节点。
//也就是如果这一层有1个节点,这个list的size就是1。如果这一层有5个节点,这个list的size就是5。
List<Integer> littleList = new LinkedList<>();
//注意:size不能写成queue.size()。因为for循环中,改变了queue的size,也就是说queue的size是很有可能增加的。
//也就不是恒定的,这样会导致结果错误。
//queue.size()定好的size,这里就不要动了。定好了size,再开干。
for (int i = 0; i < size; i++) {
TreeNode curNode = queue.poll();//弹出第一个节点。
littleList.add(curNode.val);//将弹出的当前节点添加到"小链表"中。
if (curNode.left != null) {//如果当前节点有左子节点
queue.add(curNode.left);//就把左子节点,添加到队列中。
}
if (curNode.right != null) {//如果当前节点有右子节点
queue.add(curNode.right);//就把右子节点,添加到队列中。
}
}
ans.add(0, littleList);//每处理完一层,就将装完一层中所有节点的littleList,添加到大连表的索引为0的位置。即第一个位置。
}
return ans;//直到队列queue中的所有节点都弹出了,大连表也就收集好了。返回大连表ans。
}
}