1. 程式人生 > 實用技巧 >[程式設計題] 知識點:廣度優先遍歷-二叉樹的層序遍歷

[程式設計題] 知識點:廣度優先遍歷-二叉樹的層序遍歷

[程式設計題] 知識點: 廣度優先遍歷-二叉樹的層序遍歷

題目

參考

練習:二叉樹的層序列印(使用BFS)

題目

輸入輸出

Java程式碼

提示:

對於題目中方法是要求一開始返回一個int陣列的,但是我們事先不知道樹的節點的個數,如果我們遍歷統計樹的節點個數,顯然是不划算的。

那麼我們如何new 這個陣列的長度呢? 因為陣列new 不像集合,陣列是要指定初始大小的、

所以我們採用先放入一個集合的list中,處理完了之後再從集合獲取集合的使用大小,把其中元素轉入到int陣列中。

  • 這裡依然碰到一個問題,如果正常返回,那麼返回一個帶有實際元素的陣列
  • 但是如果樹為空,我們如何返回一個empty的陣列呢。如果用new int[1];預設是被初始化為[0]的還是不滿足[]

解決:

​ 使用stream直接把list轉為int[] 返回。省去了好多程式碼。也可以返回空的陣列。

如果是空的集合,那麼返回空的陣列;

如果是非空集合,轉換為陣列返回:

return lis.stream().mapToInt(Integer::valueOf).toArray();

Java程式碼:

import java.util.*;
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    /*思想:相當於樹的廣度優先遍歷:需要藉助佇列*/
    public int[] levelOrder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();//佇列
        //由於不知道樹的元素個數,就先放入list,最終根據list生成一個int[]返回
        ArrayList<Integer> lis = new ArrayList<>();
        queue.offer(root);//把root節點放入到佇列

        //極端條件判斷(當我們要返回一個空陣列的話,new int[1]是預設為[1]的陣列的;故用如下返回[])
        if(root==null) {return lis.stream().mapToInt(Integer::valueOf).toArray();}

        //當隊不為空的時候執行
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            lis.add(node.val);//放入到結果集
            //判斷左節點是否空,不為空就訪問並且加入佇列中
            if(node.left==null && node.right==null) {continue;}
            if(node.left!=null){
                queue.offer(node.left);
            }
            //同理,右節點
            if(node.right != null){
                queue.offer(node.right);
            }
        }
        //退出while後就可以返回結果了(建議通過如下的stream方式直接返回)
        //int[] res = new int[lis.size()];
        //for(int i=0;i<lis.size();i++){res[i] = lis.get(i);}
        return lis.stream().mapToInt(Integer::valueOf).toArray();
    }
}