Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).node
BFScode
思路: 典型的BFS, 使用queue. 兩層循環,外層判斷queue 是否爲空,內層for循環queue的size,而後逐個彈出node, 把左右兒子再壓入。 注意開始的root == null 的判斷。it
時間複雜度: O(N)
空間複雜度: O(w) where w is maximum width of Binary Tree.io
public class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<List<Integer>>(); Queue<TreeNode> queue = new LinkedList<TreeNode>(); if (root == null) { return result; } queue.add(root); while (queue.peek() != null) { int size = queue.size(); List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); list.add(node.val); if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } result.add(list); } return result; } }
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).for循環
思路: BFS, 由於是bottom-up, 因此每次加入list都加到開頭:bfs.add(0, level);class
public class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> bfs = new ArrayList<List<Integer>>(); Queue<TreeNode> queue = new LinkedList<TreeNode>(); if (root == null) { return bfs; } queue.add(root); while(!queue.isEmpty()){ ArrayList<Integer> level = new ArrayList<Integer>(); int size = queue.size(); for(int i = 0; i < size; i++){ TreeNode head = queue.poll(); level.add(head.val); if(head.left != null){ queue.add(head.left); } if(head.right != null){ queue.add(head.right); } } bfs.add(0, level); } return bfs; } }
思路: 設置一個flag,來肯定該層是從左往右,仍是從右往左。Collections.reverse(level) 變換方向。List
public class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<List<Integer>>(); if(root == null){ return result; } Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.offer(root); int flag = -1; while(queue.peek() != null){ flag = 0 - flag; int size = queue.size(); List<Integer> level = new ArrayList<Integer>(); for(int i = 0; i < size; i++){ TreeNode head = queue.poll(); level.add(head.val); if(head.left != null){ queue.offer(head.left); } if(head.right != null){ queue.offer(head.right); } } if(flag == -1){ Collections.reverse(level); } result.add(level); } return result; } }