1. 程式人生 > 其它 >n叉樹後序遍歷--迭代法

n叉樹後序遍歷--迭代法

二叉樹遍歷的升級----->對於n叉樹遍歷,利用棧的處理以及對孩子結點的處理值得注意

https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/

後序遍歷,迭代方式:

class Solution {
public:
    vector<int> postorder(Node* root) {
        vector<int> res;
        if (root == nullptr) {
            return res;
        }

        stack<Node *> st;
        unordered_set<Node *> visited;
        st.emplace(root);
        while (!st.empty()) {
            Node * node = st.top();
            /* 如果當前節點為葉子節點或者當前節點的子節點已經遍歷過 */
            if (node->children.size() == 0 || visited.count(node)) {
                        res.emplace_back(node->val);
                st.pop();
                continue;
            }
            for (auto it = node->children.rbegin(); it != node->children.rend(); it++) {
                st.emplace(*it);
            }
            visited.emplace(node);
        }       
        return res;
    }
};

反轉先根遍歷的結果:

class Solution {
public:
    vector<int> postorder(Node* root) {
        vector<int> res;
        if (root == nullptr) {
            return res;
        }

        stack<Node *> st;
        st.emplace(root);
        while (!st.empty()) {
            Node * node = st.top();
            st.pop();
            res.emplace_back(node->val);
            for (auto &item : node->children) {
                st.emplace(item);
            }
        }       
        reverse(res.begin(), res.end()); 
        return res;
    }
};