二叉樹層次遍歷(遞歸版)


題目:

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

例如:
給定二叉樹 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的層次遍歷為:

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

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

分析:

看到這個題目我第一反應是遞歸,不過貌似好像大概還有挺多不同的解法。本篇文章記錄一下我的遞歸思路,其他的算法留待日后學習。

力扣上給出的空方法模板的返回值為List<List<Integer>>,結合題干可知,每一層的節點數值應按順序存入一個集合中,所有的節點集合也要保存在一個集合中。

那么問題來了,對於方法而言,二叉樹的層數是未知的,那么應該創建多少個節點集合呢?可以先用遞歸來求一下二叉樹的最長路徑,但是,考慮到時間復雜度和空間復雜度的話,我否定了這個想法。

最終我選擇在遞歸中創建節點集合,當訪問到每一層的最左節點時,創建該層的節點集合,方法就是通過一個int值來記錄二叉樹的層數,當到達二叉樹的第一層(頂層)時,int為0,此時集合內尚未創建頂層節點集合,事實上這個時候集合內沒有任何節點集合,所以它的size為0,以此類推,我們分析可知,當集合的size小於等於當前層數記錄(也就是int值)的時候,需要創建當前層的節點集合。

當遞歸訪問下一層時,需將當前層數記錄+1傳給遞歸方法。

最終由於集合最先添加的是頂層節點的集合,最后添加的是最底層葉子節點的集合,所以按照題目要求,最終需要將集合倒序排列。

題解:

 

/**
 * 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>> lists = new ArrayList<>();
        getVal(root, lists, 0);
        Collections.reverse(lists);
        return lists;
    }

    public void getVal(TreeNode root, List<List<Integer>> lists, int curr) {
        if (root == null) {
            return;
        }
        if (lists.size() <= curr) {
            lists.add(new ArrayList<>());
        }
        lists.get(curr).add(root.val);
        getVal(root.left, lists, curr + 1);
        getVal(root.right, lists, curr + 1);
    }
}

 

本篇小結:

其實,這些二叉樹、遞歸什么的概念之前一直是知道的,但也僅限於知道而已,可以說沒有真正的好好練習和應用過,最近學習算法的時候有幾次用到,沒想到還挺香~

不過在做這道算法題的時候,還是小小的糾結了一下,我當時的疑惑是遞歸方法會按照我預想的順序執行嗎?

假設現在有一個二層的二叉樹:

    6
   / \
  7  8

我希望的執行順序是先將6添加進集合,再將7添加進集合,最后將8添加進集合。

在遞歸方法中首先將6添加進集合,然后依次調用了訪問節點7和節點8的遞歸,雖然代碼是有先后次序,但是方法執行時會按照次序執行嗎?

在實踐中發現,是我想多了,頓時覺得心情舒暢,看來以后可以更加愉快的使用遞歸了!

第二個收獲就是又發現了一個寶藏方法Collections.reverse(),將集合倒序重排,愛了愛了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM