1. 程式人生 > 其它 >Leetcode107. 二叉樹的層序遍歷 II

Leetcode107. 二叉樹的層序遍歷 II

Leetcode107. 二叉樹的層序遍歷 II

題目描述

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

思路分析

  1. 二叉樹的層序遍歷,及一層一層的遍歷二叉樹,將每一層遍歷的結果儲存到集合中
  2. 因此需要維護一個佇列儲存每層的節點,然後遍歷這些節點,取值並將它的子節點再記錄到佇列中
  3. 因為是自底向上的層序遍歷,因此要將每層遍歷的節點值新增到集合的首部
  4. 詳解程式碼見下

原始碼及分析

 /**
     * @param root 根節點
     * @return 返回層序遍歷的結果
     */
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        //定義集合儲存結果,注意新增結果時要新增到集合的頭部
        LinkedList<List<Integer>> res = new LinkedList<>();
        //資料校驗
        if (root == null) {
            return res;
        }
        //維護一個佇列儲存每一層的節點
        Queue<TreeNode> nodes = new LinkedList<>();
        nodes.offer(root);
        while (!nodes.isEmpty()){
            //建立集合儲存每一層的節點值
            ArrayList<Integer> level = new ArrayList<>();
            //記錄每一層的節點數,用於遍歷
            int size = nodes.size();
            //遍歷每一層的節點,記錄節點值,並記錄下一層子節點
            for (int i = 0; i < size; i++) {
                TreeNode node = nodes.poll();
                level.add(node.val);
                if (node.left != null){
                    nodes.offer(node.left);
                }
                if (node.right != null){
                    nodes.offer(node.right);
                }
            }
            //將每一層結果倒序新增
            res.add(0,level);
        }
        return res;
    }