1. 程式人生 > >LeetCode-107. Binary Tree Level Order Traversal II (java)

LeetCode-107. Binary Tree Level Order Traversal II (java)

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 example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its bottom-up level order traversal as:

[
  [15,7],
  [9,20],
  [3]
]
------------------------------------------------------------------------------------------------------------------------

題意

把一個二叉樹自底向上輸出。

思路

第一眼看上去開始想怎麼用棧去解決,是不是要計算樹的深度然後從最大深度的地方開始遍歷等等。

其實想得太多,並沒有看懂例子理解意思。

程式碼

public class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
         Queue<TreeNode> queue = new LinkedList<TreeNode>();
        List<List<Integer>> wrapList = new LinkedList<List<Integer>>();        
        if(root == null) return wrapList;        
        queue.offer(root);
        while(!queue.isEmpty()){
            int levelNum = queue.size();
            List<Integer> subList = new LinkedList<Integer>();
            for(int i=0; i<levelNum; i++) {
                if(queue.peek().left != null) {
                	queue.offer(queue.peek().left);
                }
                if(queue.peek().right != null) {
                	queue.offer(queue.peek().right);
                }
                subList.add(queue.poll().val);
            }
            wrapList.add(0, subList);
        }
        return wrapList;
    }
}
方法中利用佇列的特點先進先出,自頂向下遍歷二叉樹,然後利用list的add(args1,args2)方法,將輸出的二叉樹插入到結果list的最前面,

實現自底向上輸出。

另外還有利用遞迴解決本題的方法

public class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if(root == null) {
            return res;
        }
        helper(root, 0, res);
        return res;
    }
    
    public void helper(TreeNode root, int depth, List<List<Integer>> res) {
        if(root == null) {
            return;
        }
        if(res.size() <= depth) {
            res.add(0, new ArrayList<Integer>());
        }
        
        helper(root.left, depth+1, res);
        helper(root.right, depth+1, res);

        res.get(res.size() - depth - 1).add(root.val);
    }
}
這個採用遞迴的方法,在每次遞迴時,深度+1,同時建立list用來後面接受樹的值。