二叉樹的層序遍歷序列存儲--層級BFS

0x01.問題

給你一個二叉樹,請你返回其按 層序遍歷 得到的節點值。 (即逐層地,從左到右訪問所有節點)。

示例:
二叉樹:
[3,9,20,null,null,15,7],

3   
 / \ 
   9 
    20
   /  \   
   15   7

返回其層次遍歷結果:

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


 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }

public List<List<Integer>> levelOrder(TreeNode root)

0x02.簡要分析

  • 我們知道,如果要直接輸出二叉樹的中序遍歷的話,很容易,只需要使用隊列,第一次存入根節點,之後在每次輸出對頭元素之後,再繼續把左右孩子節點入隊。

  • 其實把這個中序序列存入一個集合中,大體方法還是一樣的,不過對於層級的劃分,需要額外的考慮了,因爲是二級集合,所以要確定每一層存入的是哪些節點。

    • 最爲容易想到的辦法,是維護一個狀態(TreeNode,level),表示每個節點的層級,子樹層級加1,最後根據層級再重新進行存儲。但是,這需要消耗更多額外的空間,也沒有更好的辦法呢?
    • 我們知道,BFS在遍歷的時候,是把左右孩子都存入隊列中,那麼在一層中存入的左右孩子,層級應該是相同的,也就是說,如果我們每次在BFS的時候,每次遍歷完一層,就可以清楚的把層級相同的分個一個集合中,完成了最終的目的。
  • 詳細算法:

    • (1)構造二級集合,如果root爲空,直接返回。否則創建隊列,並將根節點存入隊列。
    • (2)當隊列不爲空時,取出當前隊列的長度currSize,遍歷所有這一層的節點,並在遍歷的時候完成節點的存儲,左右孩子的入隊。

0x03.解決代碼–BFS

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ans=new ArrayList<>();
        if(root==null){
            return ans;
        }
        Deque<TreeNode> q=new ArrayDeque<>();
        q.addLast(root);
        while(!q.isEmpty()){
            int currSize=q.size();
            List<Integer> f=new ArrayList<>();
            for(int i=1;i<=currSize;i++){
                TreeNode curr=q.removeFirst();
                f.add(curr.val);
                if(curr.left!=null){
                    q.addLast(curr.left);
                }
                if(curr.right!=null){
                    q.addLast(curr.right);
                }
            }
            ans.add(f);
        }
        return ans;
    }
}

ATFWUS --Writing By 2020–05-13

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