每日一题——N 叉树的后序遍历

94 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。

n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

示例 1:

image-20220312151945887

输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]

示例 2:

image-20220312152029248

输入: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;
​
    }
};