[程式設計題] 知識點:廣度優先遍歷-二叉樹的層序遍歷
阿新 • • 發佈:2020-07-28
[程式設計題] 知識點: 廣度優先遍歷-二叉樹的層序遍歷
題目
練習:二叉樹的層序列印(使用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(); } }