题目描述
给定一个 N 叉树,返回其节点值的后序遍历。
例如,给定一个 3叉树 :
返回其后序遍历: [5,6,3,2,4,1].
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal
解法1:递归
这种解法比较简单。对于每一个节点都优先遍历它的子节点,最后遍历根节点。
/*
// Definition for a Node.
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public:
vector<int> postorder(Node* root) {
vector<int> result;
postorder(root, result);
return result;
}
void postorder(Node* root, vector<int>& result) {
if(root == nullptr)
return;
for(auto node : root->children)
postorder(node, result);
result.push_back(root->val);
}
};
解法2:迭代法
将每一个节点和布尔变量做映射,该布尔变量表示该节点是否被访问。定义一个节点已经被访问:该节点所有的子节点都已经被访问。
class Solution {
public:
vector<int> postorder(Node* root)
{
vector<int> result;
if(root == nullptr)
return result;
stack<pair<Node*, bool>> s;
s.push(make_pair(root, false));//初始化,将根节点标记为未访问
while(!s.empty()) {
auto& node = s.top();
bool visited = node.second;
if(!visited) {
int size = node.first->children.size() - 1;
for(int i = size; i >= 0; i--) {
if(node.first->children[i])
s.push(make_pair(node.first->children[i], false));
}
node.second = true;//将该节点标记为已经访问
}
else {//栈顶的这个节点已经被访问
node = s.top();
result.push_back(node.first->val);//将栈顶节点的值放入数组
s.pop();//将栈顶节点出栈
}
}
return result;
}
};