给定一个N叉树,返回其节点值的后序遍历。
例如,给定一个 3叉树
:
返回其后序遍历: [5,6,3,2,4,1]
.
说明: 递归法很简单,你可以使用迭代法完成此题吗?
思路:这道题还是采用两种方法来解,迭代法和递归。
递归:递归很基础,直接给出代码
参考代码:
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
void postorderHeler(Node* root, vector<int> &res) {
for (int i = 0; i < root->children.size(); i++) {
postorderHeler(root->children[i], res);
}
if (root != nullptr) res.push_back(root->val);
}
vector<int> postorder(Node* root) {
vector<int> res;
if (root == nullptr) return res;
postorderHeler(root, res);
return res;
}
};
迭代法:使用一个辅助栈,每次按照根-左-右的顺序放入栈中,即把栈顶元素取出放入res中,再把栈顶元素的左右孩子放入栈中,这样res中保存的就是根-右-左的顺序,最后返回res的逆序即可。
参考代码:
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<int> postorder(Node* root) {
stack<Node*> s;
vector<int> res;
if (root == nullptr) return res;
s.push(root);
while (!s.empty()) {
Node* node = s.top(); s.pop();
res.push_back(node->val);
for (auto r : node->children) s.push(r);
}
reverse(res.begin(), res.end());
return res;
}
};