1. 程式人生 > >LeetCode演算法題-N-ary Tree Level Order Traversal(Java實現)

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+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!