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

題目描述(簡單難度)

樹的層次遍歷,和 102 題 的不同之處是,之前輸出的數組順序是從根部一層一層的輸出,現在是從底部,一層一層的輸出。

解法一 DFS

102 題DFS貼過來看一下。

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> ans = new ArrayList<>(); 
    DFS(root, 0, ans);
    return ans;
}

private void DFS(TreeNode root, int level, List<List<Integer>> ans) {
    if(root == null){
        return;
    }
    //當前層數還沒有元素,先 new 一個空的列表
    if(ans.size()<=level){
        ans.add(new ArrayList<>());
    }
    //當前值加入
    ans.get(level).add(root.val);

    DFS(root.left,level+1,ans);
    DFS(root.right,level+1,ans);
} 

之前我們根據 level 得到數組的位置,然後添加。

ans.get(level).add(root.val);

ans    [] [] [] [] [].
index  0  1  2  3  4
level  0  1  2  3  4
       ------------>
index = 0 + level

現在 level 是逆過來存的
ans    [] [] [] [] [].
index  0  1  2  3  4
level  4  3  2  1  0
       <------------
index = 4 - level

4 就是 ans 的末尾下標,就是 ans.size() - 1
所以代碼變爲
ans.get(ans.size() - 1 - level).add(root.val);

此外還有句代碼要改。

if(ans.size()<=level){
    ans.add(new ArrayList<>());
}
在添加當前 level 的第一個元素的時候,首先添加一個空列表到 ans 中
假設當前 level = 2,ans 中只添加了 level 是 01 的元素
ans    [3] [9] 
index   0   1  
level   1   0  
因爲 level 是從右往左增加的,所以空列表要到 ans 的頭部
ans     [] [3] [9] 
index   0   1   2
level   2   1   0  
所以代碼改成下邊的樣子
 ans.add(0new ArrayList<>());

綜上,只要改了這兩處就可以了。

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    List<List<Integer>> ans = new ArrayList<>();
    DFS(root, 0, ans);
    return ans;
}

private void DFS(TreeNode root, int level, List<List<Integer>> ans) {
    if (root == null) {
        return;
    }
    // 當前層數還沒有元素,先 new 一個空的列表
    if (ans.size() <= level) {
        ans.add(0, new ArrayList<>());
    }
    // 當前值加入
    ans.get(ans.size() - 1 - level).add(root.val);

    DFS(root.left, level + 1, ans);
    DFS(root.right, level + 1, ans);
}

解法二 BFS

102 題 從根節點往下走的代碼貼過來。

public List<List<Integer>> levelOrder(TreeNode root) {
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    List<List<Integer>> ans = new LinkedList<List<Integer>>();
    if (root == null)
        return ans;
    queue.offer(root);
    while (!queue.isEmpty()) {
        int levelNum = queue.size(); // 當前層元素的個數
        List<Integer> subList = new LinkedList<Integer>();
        for (int i = 0; i < levelNum; i++) {
            TreeNode curNode = queue.poll();
            if (curNode != null) {
                subList.add(curNode.val); 
                queue.offer(curNode.left);
                queue.offer(curNode.right);
            }
        }
        if(subList.size()>0){
            ans.add(subList);
        }
    }
    return ans;
} 

BFS相比於DFS要簡單些,因爲BFS是一次性把當前層的元素都添加到ans中,所以我們只需要改一句代碼。

ans.add(subList);

改成添加到頭部即可。

ans.add(0,subList);

再改個函數名字, 總體代碼就是

public List<List<Integer>> levelOrderBottom(TreeNode root) {
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    List<List<Integer>> ans = new LinkedList<List<Integer>>();
    if (root == null)
        return ans;
    queue.offer(root);
    while (!queue.isEmpty()) {
        int levelNum = queue.size(); // 當前層元素的個數
        List<Integer> subList = new LinkedList<Integer>();
        for (int i = 0; i < levelNum; i++) {
            TreeNode curNode = queue.poll();
            if (curNode != null) {
                subList.add(curNode.val);
                queue.offer(curNode.left);
                queue.offer(curNode.right);
            }
        }
        if (subList.size() > 0) {
            ans.add(0, subList);
        }
    }
    return ans;
}

這道題依舊考層次遍歷,只需要在 102 題 的基礎上,找到 levelindex 的對應關係即可。此外,因爲我們在頭部添加元素,所以用鏈表會好一些。如果數組的話,還得整體後移才能添加新的元素。

更多詳細通俗題解詳見 leetcode.wang

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章