Leetcode 590. N叉树的后序遍历
给定一个N叉树,返回其节点值的后序遍历。
例如,给定一个 3叉树 :
返回其后序遍历:[5,6,3,2,4,1].
说明: 递归法很简单,你可以使用迭代法完成此题吗?
题目解释
在之前的一些文章中,我曾提过二叉搜索树的后序遍历:左->右->根。现在为N叉树,意思也是一样的,即先从最左边的孩子一直遍历到最右边的孩子,再遍历根节点即可。
解答
1.如果是递归方法,和BST的后序遍历本质上没有多少区别,但是挑战是使用迭代进行后序遍历。
2.在这里,我会提到使用stack堆栈进行辅助后序遍历。
3.根据以上题目示例,使用堆栈进行从左到右入栈再出栈而得到的结果是[1, 4, 2, 3, 6, 5], 很明显这不是我们想要的结果。
4.仔细观察,上面的结果恰好是正确结果的反序,那我们只需在最后返回结果的时候进行反序操作即可。
5.使用队列也可以实现,只不过是从右到左入队,留给同学们自己实现啦。
代码
/*
// 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) {
// 使用堆栈即可运用迭代的方法进行N叉树的后序遍历
vector<int> res;
if (!root)
return res;
stack<Node*> stack_Tree;
stack_Tree.push(root);
while(!stack_Tree.empty()){
// 获取栈顶元素
Node* p = stack_Tree.top();
// 出栈
stack_Tree.pop();
res.push_back(p->val);
// 再把该节点的孩子进行入栈
for (size_t i = 0; i < p->children.size(); ++i)
stack_Tree.push(p->children[i]);
}
// 最后,进行反序返回结果
reverse(res.begin(), res.end());
return res;
}
};