LeetCode——107. 二叉樹的層次遍歷 II
阿新 • • 發佈:2018-12-10
題目
給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)
例如: 給定二叉樹
[3,9,20,null,null,15,7]
,3 / \ 9 20 / \ 15 7返回其自底向上的層次遍歷為:
[ [15,7], [9,20], [3] ]
解題思路
沒想到直接自底向上的方法,所以採用自上向下遍歷然後把佇列反轉。
程式碼實現
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> reList = new ArrayList(); // 返回的佇列 List<TreeNode> nodeList = new ArrayList(); // 裝節點的佇列 List<Integer> currentLayerList = new ArrayList(); // 裝值的佇列 // 如果root為空直接返回reList if (root == null ) { return reList; } // 初始化根節點 nodeList.add(root); // 迴圈到樹最後一層 while (!nodeList.isEmpty()) { // 每次迴圈前裝值的佇列清空 currentLayerList = new ArrayList(); // 儲存下層節點 List<TreeNode> nextNodeList = new ArrayList(); // 當前層的元素裝入當前層元素值佇列 for (TreeNode tn : nodeList) { currentLayerList.add(tn.val); //節點不為空才新增 if (tn.left != null) { nextNodeList.add(tn.left); } if (tn.right != null) { nextNodeList.add(tn.right); } } // 重置當前裝節點的佇列 nodeList = nextNodeList; // 將當前層元素值佇列加入 返回佇列 reList.add(currentLayerList); } // 返回佇列由從上之下變為由底至上 List<List<Integer>> newReList = new ArrayList(); int N = reList.size(); for (int i = 0; i < N; i++) { newReList.add(reList.get(N-i-1)); } return newReList; } }