1. 程式人生 > >LeetCode——107. 二叉樹的層次遍歷 II

LeetCode——107. 二叉樹的層次遍歷 II

題目

給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)

例如: 給定二叉樹 [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;
    }
}