[leetcode] 102. 二叉樹的層次遍歷
阿新 • • 發佈:2018-11-06
二叉樹的層次遍歷很簡單,用佇列實現bfs即可。
這裡難點是要區分出每一層的樓層,分別放到對應的數組裡
實際上在bfs的時候判斷好在什麼時候就進入了下一層即可。
設定一個標記位,用來標記當前元素是本層的最後一個元素。顯然,第一層的root只有一個元素,為第一個標記。
仔細觀察可以發現,下一層的最後一個元素為當前佇列中最後一個元素,把標記更新即可。
class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> list = new ArrayList<>(); if (root == null) return list; LinkedList<TreeNode> queue = new LinkedList<>(); queue.offer(root); TreeNode flag = root; List<Integer> nowNumList = new ArrayList<>(); list.add(nowNumList); while (!queue.isEmpty()) { TreeNode nowNode = queue.poll(); nowNumList.add(nowNode.val); TreeNode sonNode = nowNode.left; if (sonNode != null) queue.offer(sonNode); sonNode = nowNode.right; if (sonNode != null) queue.offer(sonNode); if (flag == nowNode && !queue.isEmpty()) {//判斷當前元素是否為本層最後一個節點。注意要判斷當處於最後一層的時候不執行,否則會新增一個空的list nowNumList = new ArrayList<>(); list.add(nowNumList); flag = queue.peekLast();//更新標記 } } return list; } }
相比普通dfs,僅僅多出幾行程式碼:
TreeNode flag = root;
List<Integer> nowNumList = new ArrayList<>();
...
if (flag == nowNode && !queue.isEmpty()) {
nowNumList = new ArrayList<>();
list.add(nowNumList);
flag = queue.peekLast();
}