590. N叉树的后序遍历

2019/07/16 22:17 下午 posted in  leetcode

问题

给定一个 N 叉树,返回其节点值的后序遍历。
例如,给定一个 \(3叉树\):

返回其后序遍历: \([5,6,3,2,4,1]\).

**说明: **递归法很简单,你可以使用迭代法完成此题吗?

解法

589. N叉树的前序遍历基本一样,只是把前序变成后续即可。
但是迭代的后序遍历比较难。这里考虑用双栈法处理。同时,联想到java的List接口提供一个add(int index, E val)的方法,可以当作栈使用,所以,其实第二个栈可以直接用result代替。

代码

java

递归

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val,List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/
class Solution {
    private List<Integer> result = new LinkedList<>();
    
    public List<Integer> postorder(Node root) {
        if (root == null) {
            return result;
        }
        dfs(root);
        return result;
    }
    private void dfs(Node root) {
        if (root == null) {
            return;
        }
        //优先去遍历子树而不是root本身
        if (root.children !=null) {
            for(Node node:root.children) {
                dfs(node);
            } 
        }
        result.add(root.val);
    }
}

递归

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val,List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/
class Solution {
    private List<Integer> result = new LinkedList<>();
    
    public List<Integer> postorder(Node root) {
        if (root == null) {
            return result;
        }
        Stack<Node> stack = new Stack<>();
        stack.add(root);
        while(!stack.empty()) {
            Node node = stack.pop();
            //直接将当前val写入result第一个元素即可。
            result.add(0, node.val);
            //这里要注意。是node.children。一开始写成了root.children...
            //而且与前序遍历不同,这里是从左往右入栈,如果不能想清楚可以在纸上画一下。
            List<Node> children = node.children;
            if (children != null) {
                stack.addAll(children);
            }
        }
        return result;
    }
}