LeetCode演算法題-N-ary Tree Level Order Traversal(Java實現)
這是悅樂書的第225次更新,第238篇原創
01 看題和準備
今天介紹的是LeetCode演算法題中Easy級別的第92題(順位題號是429)。給定n-ary樹,返回其節點值的級別順序遍歷。(即,從左到右,逐級)。例如,給定一個3-ary樹:
我們應該返回它的級別順序遍歷:
[[1],[3,2,4][5,6]]
注意:
樹的深度最多為1000。
節點總數最多為5000。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
使用廣度優先演算法(BFS),一級一級,從左往右遍歷,對此我們藉助佇列來實現。
特殊情況:當root為null時,直接返回一個沒有任何元素的list。
正常情況:先將root放入佇列,然後開始迴圈,最外層迴圈,我們新建一個list,存入每一級的元素,第二層迴圈開始處理佇列中上一輪被新增進去的node,依次poll出來,將其val存入外層迴圈新建的list中,而其另一個屬性children,因為是一個以node為元素的陣列,所以在此使用for-each迴圈,將其新增進佇列中,在下一輪迴圈時再從佇列中取出。
// Definition for a Node. class Node { public int val; public List<Node> children; public Node() {} public Node(int _val,List<Node> _children) { val = _val; children = _children; } } class Solution { public List<List<Integer>> levelOrder(Node root) { List<List<Integer>> result = new ArrayList<>(); if (root == null) { return result; } Queue<Node> queue = new LinkedList<Node>(); queue.offer(root); while (!queue.isEmpty()) { List<Integer> current = new ArrayList<>(); int length = queue.size(); for (int i=0; i<length; i++) { Node curr = queue.poll(); current.add(curr.val); for (Node n : curr.children) { queue.offer(n); } } result.add(current); } return result; } }
03 第二種解法
使用深度優先演算法(DFS),此方法就需要使用遞迴來操作了。
在樹的每一級,都可以看做是當前問題的子問題,因此我們將陣列、根節點、層級這三個要素作為遞迴的條件。在遞迴方法中,如果當前節點為null,直接return;如果當前result的大小和層級相等,就往result新加一個list,然後從result中取出當前層級對應的陣列,先將當前節點值新增進去,然後for-each遍歷其children,每一個children都符合當前問題的描述,在此呼叫方法自身,但是第三個引數層級需要往上加1,因為進入了當前節點的下一層級。
// Definition for a Node. class Node { public int val; public List<Node> children; public Node() {} public Node(int _val,List<Node> _children) { val = _val; children = _children; } } class Solution { public List<List<Integer>> levelOrder(Node root) { List<List<Integer>> result = new ArrayList<>(); levelOrder(root, result, 0); return result; } public void levelOrder(Node root, List<List<Integer>> result, int level) { if (root == null) { return ; } if (result.size() == level) { result.add(new ArrayList<>()); } List<Integer> list = result.get(level); list.add(root.val); for (Node n : root.children) { levelOrder(n, result, level+1); } } }
04 小結
演算法專題目前已連續日更超過兩個月,演算法題文章92+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!