Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]
示例 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] 输出:[2,6,14,11,7,3,12,8,4,13,9,10,5,1]
思路
当我们看到这道题时,可以很容易发现这是一道树的遍历,针对树的遍历我们一般可以使用dfs深度优先遍历的方法进行解决。如果是二叉树,先访问左右子节点再访问当前节点。换成 N 叉,也是一样先把 children 都遍历了,在访问当前节点。后序遍历,只要每次取出当前节点的孩子节点,在倒叙深度优先遍历所有的节点即可。
代码
/*
// 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:
void dfs(vector<int> &ve,Node* root){
if(root == NULL) return;// 如果根节点为空返回
vector<Node*> childrens = root->children;
int length = childrens.size();
for(int i = length - 1;i >=0;i--)
{
// 后序遍历所有的接节点
ve.push_back(childrens[i]->val);
dfs(ve,childrens[i]);
}
}
vector<int> postorder(Node* root) {
vector<int> ans;
if(root == NULL) return ans;
// 把根节点放入数组中
ans.push_back(root->val);
dfs(ans,root);
vector<int> res;
// 把结果倒序输出
for(int i = ans.size() - 1;i >=0;i--)
{
res.push_back(ans[i]);
}
return res;
}
};