package com.freetymekiyan.algorithms.level.easy; import com.freetymekiyan.algorithms.utils.Utils.TreeNode; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; /** * Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by * level). * <p> * For example: * Given binary tree [3,9,20,null,null,15,7], * | 3 * | / \ * | 9 20 * | / \ * | 15 7 * return its level order traversal as: * | [ * | [3], * | [9,20], * | [15,7] * | ] * Company Tags: LinkedIn, Facebook, Amazon, Microsoft, Apple, Bloomberg * Tags: Tree, Breadth-first Search * Similar Problems: (M) Binary Tree Zigzag Level Order Traversal, (E) Binary Tree Level Order Traversal II, (E) * Minimum Depth of Binary Tree, (M) Binary Tree Vertical Order Traversal */ public class BinaryTreeLevelOrderTraversal { /** * BFS. * Instead of regular BFS, visit one level at each iteration. * By getting the size of the queue, we know how many nodes in current level. */ private List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) { return res; } Queue<TreeNode> queue = new LinkedList<>(); queue.add(root); List<Integer> curLevel = new LinkedList<>(); while (!queue.isEmpty()) { for (int i = queue.size(); i > 0; i--) { TreeNode n = queue.poll(); curLevel.add(n.val); if (n.left != null) { queue.add(n.left); } if (n.right != null) { queue.add(n.right); } } res.add(new ArrayList<>(curLevel)); curLevel.clear(); } return res; } /** * DFS. * Root is level 0, pass level + 1 to its children during DFS. * Add the node to its level list in the result. * Stop when reach null node. */ public List<List<Integer>> levelOrderB(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); dfs(root, 0, res); return res; } public void dfs(TreeNode root, int level, List<List<Integer>> res) { if (root == null) { return; } // Visit. if (res.size() <= level) { res.add(new ArrayList<>()); } res.get(level).add(root.val); // Recurse to left and right child. dfs(root.left, level + 1, res); dfs(root.right, level + 1, res); } }