二叉树的层序遍历 II

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。
    }

}

 

posted @ 2022-08-12 22:35  TheFloorIsNotTooHot  阅读(23)  评论(0)    收藏  举报