n叉樹後序遍歷--迭代法
阿新 • • 發佈:2022-03-15
二叉樹遍歷的升級----->對於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; } };