递归:
class Solution {
public:
vector<int> res;
vector<int> postorder(Node* root) {
dfs(root);
return res;
}
void dfs(Node* root){
if(root == NULL) return;
for(int i = 0; i < root -> children.size(); i ++) dfs(root -> children[i]);
res.push_back(root -> val);
}
};
非递归:
栈里存放一个pair,其中
第一位放当前节点已经遍历过的子节点数量
第二位放当前节点
根节点入栈
每次取出来栈顶,如果当前节点的子节点已经全部遍历过了,那么将这个节点的数值放入答案中,否则先把子节点入栈,然后在把当前节点入栈
class Solution {
public:
vector<int> postorder(Node* root) {
vector<int> res;
stack<pair<int, Node*>> s;
s.push({0, root});
while(!s.empty()){
auto p = s.top();
s.pop();
if(p.second == NULL) continue;
if(p.first == p.second -> children.size()) res.push_back(p.second -> val);
if(p.first < p.second -> children.size()){
s.push({p.first + 1, p.second});
s.push({0, p.second -> children[p.first]});
}
}
return res;
}
};