1. 程式人生 > >[LeetCode] N-ary Tree Postorder Traversal N叉樹的後序遍歷

[LeetCode] N-ary Tree Postorder Traversal N叉樹的後序遍歷

Given an n-ary tree, return the postorder traversal of its nodes' values.

For example, given a 3-ary tree:

Return its postorder traversal as: [5,6,3,2,4,1].

Note:

Recursive solution is trivial, could you do it iteratively?

這道題讓我們求N叉樹的後序遍歷,由於有了之前那道Binary Tree Postorder Traversal的基礎,瞭解了二叉樹的後序遍歷,則N叉樹的後序遍歷也就沒有那麼難了。首先還是用遞迴來做,在遞迴函式中,判空後,遍歷子結點陣列,對所有的子結點呼叫遞迴函式,然後在for迴圈之外在將當前結點值加入結果res陣列,這樣才能保證是後序遍歷的順序,參見程式碼如下:

class Solution {
public:
    vector<int> postorder(Node* root) {
        vector<int> res;
        helper(root, res);
        return res;
    }
    void helper(Node* node, vector<int>& res) {
        if (!node) return;
        for (Node* child : node->children) {
            helper(child, res);
        }
        res.push_back(node
->val); } };

我們也可以使用迭代的方法來做,這裡有個小trick,寫法跟先序遍歷十分的像,不同的就是每次把從stack中取的結點的值都加到結果res的最前面,還有就是遍歷子結點陣列的順序是正常的順序,而前序遍歷是從子結點陣列的後面往前面遍歷,這點區別一定要注意,參見程式碼如下:

解法二:

class Solution {
public:
    vector<int> postorder(Node* root) {
        if (!root) return {};
        vector<int> res;
        stack
<Node*> st{{root}}; while (!st.empty()) { Node *t = st.top(); st.pop(); res.insert(res.begin(), t->val); for (Node* child : t->children) { if (child) st.push(child); } } return res; } };

類似題目:

參考資料: