LeetCode N叉树的后序遍历(递归、递推)

给定一个 N 叉树,返回其节点值的后序遍历。
例如,给定一个 3叉树 :
在这里插入图片描述
返回其后序遍历: [5,6,3,2,4,1].
说明: 递归法很简单,你可以使用迭代法完成此题吗?
思路分析: N叉树的后序遍历与二叉树的后序遍历思路一样,先访问子节点,再访问根节点。
请先翻阅 LeetCode 二叉树的后序遍历(递归、递推)
方法一:递归法。

/*
// 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> result;
    vector<int> postorder(Node* root) {
        myPostorder(root);
        return result;
    }
    //后序遍历:先子节点,再根节点
    void myPostorder(Node* root){
        if (root == NULL){
            return;
        }
        for (auto child : root->children){//先子节点
            myPostorder(child);
        }
        result.push_back(root->val);//再根节点
    }
};

在这里插入图片描述
方法二:递推法。

/*
// 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) {
        vector<int> result;
        set<Node*> mySet;//用于记录已经访问过的节点
        stack<Node*> myStack;//辅助队列
        while (root != NULL || !myStack.empty()){
            if (root == NULL){//恢复现场
                root = myStack.top();
                myStack.pop();
            }
            if (mySet.find(root) != mySet.end()){
                //如果这个节点访问过,直接访问根节点
                result.push_back(root->val);
            }
            else{
                mySet.insert(root);//标记访问
                myStack.push(root);//需要再次访问(根节点)
                //注意栈是先进后出,所以需要倒置放入所有子节点
                for (auto it = root->children.rbegin(); it != root->children.rend(); ++it) {
                    myStack.push(*it);
                }
            }
            root = NULL;//清空已经访问的了现场
        }
        return result;
    }
};

在这里插入图片描述

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页