算法思路

要对二叉树做层序遍历,那么要先能够知道当前层有哪些元素,然后按顺序从左往右遍历,这里最容易想到的就是用队列来存储了,队列的FIFO特性保证遍历顺序;遍历过程中保存好当前层遍历结果以及下一层的元素,然后递归直到二叉树遍历完;

算法实现

public class Solution {
    private static final Queue<TreeNode> curLevelNodes = new ArrayDeque<>();
    private static final ArrayList<ArrayList<Integer>> result = new ArrayList<>();

    /**
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        if (root != null) {
            curLevelNodes.add(root);
        }
        levelOrder(curLevelNodes);
        return result;
    }

    private void levelOrder(Queue<TreeNode> curLevelNodes) {
        if (curLevelNodes.isEmpty()) {
            return;
        }
        ArrayList<Integer> levelResult = new ArrayList<>();
        Queue<TreeNode> nextLevelNodes = new ArrayDeque<>();
        // 层序遍历
        TreeNode headNode;
        while ((headNode = curLevelNodes.poll()) != null) {
            levelResult.add(headNode.val);
            if (headNode.left != null) {
                nextLevelNodes.offer(headNode.left);
            }
            if (headNode.right != null) {
                nextLevelNodes.offer(headNode.right);
            }
        }
        // 保存层序遍历结果以及下一层节点
        result.add(levelResult);
        curLevelNodes.addAll(nextLevelNodes);
        levelOrder(curLevelNodes);
    }
}