天天看點

(二叉樹的層次周遊)LeetCode#102. Binary Tree Level Order Traversal

  • 題目:二叉樹的層次周遊,每一層周遊的結果存為一個list,最終傳回結果形式為[[],[],[]]
  • 難度:Medium
  • 思路:層次周遊的節點通路順序是:根節點,再依照先左結點後右節點,将節點按照順序存入隊列,然後通路隊列的結點
  • 代碼:

    隊列實作

public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(root == null){
            return result;
        }
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> tmp = new ArrayList<>();
            for(int i = ; i < size; i++){
                TreeNode node = queue.poll();
                tmp.add(node.val);
                if(node.left != null){
                    queue.offer(node.left);
                } 
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            result.add(tmp);
        }
        return result;
    }
}
           

層次周遊的遞歸實作,一開始我用一個ArrayList來存待通路的節點,我的代碼報 stackOverFlowError;後來看了Discuss裡的C++遞歸實作,發現可以通過傳入一個目前通路的是第幾層dep來避免使用很多空間

public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if(root == null){
            return result;
        }
        recursion(root, result, );
        return result;
    }
    public void recursion(TreeNode node, List<List<Integer>> list, int dep){
        if(node == null){
            return;
        }
        if(dep == list.size()){
            list.add(new ArrayList<>());
        }
        list.get(dep).add(node.val);
        recursion(node.left, list, dep+);
        recursion(node.right, list, dep+);
    }
}