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;
}
};