题目链接:590. N 叉树的后序遍历
题目:
给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:[1,3,5,6,2,4]
示例 2:
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]
提示:
- 节点总数在范围 [0, 104]内
- 0 <= Node.val <= 104
- n 叉树的高度小于或等于 1000
进阶:递归法很简单,你可以使用迭代法完成此题吗?
思路和算法:
建议在使用递归法之前,先去了解“递归三部曲”。
方案一:递归
本题的三部曲如下:
1、确定递归的参数和返回值:参数是节点,还需要传结果数组,因为递归函数是和题目给的函数分开来的,并且结果值是放在一个数组里,所以结果值存放的数组需要一起递归。
void traversal(vector<int>& res, Node* cur) {}
2、确定终止条件:节点为空,则直接结束递归。
if (!cur) return;
3、确定单层逻辑:将递归到的当前节点的值放入结果数组,然后递归当前节点的孩子节点。
for (Node* a : cur->children) { //遍历递归孩子节点
traversal(res, a);
}
res.push_back(cur->val); //中
代码(c++):
/*
// 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> res; //结果数组
traversal(res, root);
return res;
}
private:
//确定递归的参数和返回值
void traversal(vector<int>& res, Node* cur) {
//确定终止条件
if (!cur) return;
//确定单层逻辑
for (Node* a : cur->children) { //遍历递归孩子节点
traversal(res, a);
}
res.push_back(cur->val);
}
};
方案二:迭代
用栈来迭代。可以先按照前序遍历迭代的方法,只不过压栈时是从左往右的顺序,得到结果中右左,然后再反转结果数组,得到左右中的顺序,即我们需要的后序遍历的顺序。
/*
// 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> res; //结果数组
stack<Node*> stk;
if (root) stk.push(root);
while (!stk.empty()) {
Node* cur = stk.top(); //取出栈顶节点
stk.pop();
res.push_back(cur->val); //中
for (Node* a : cur->children) { //从左往右遍历孩子节点
if (a) stk.push(a);
}
}
//然后反转得到的结果:中右左-->左右中
reverse(res.begin(), res.end());
return res;
}
};