Leetcode 590. N叉树的后序遍历

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;
    }
};

猜你喜欢

转载自blog.csdn.net/Gary___/article/details/81604946
今日推荐