LeetCode 590 N叉树的后序遍历

题目

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

比如给定一个节点U,其子节点V1,V2,V3, 那么他的后序遍历顺序为[V1的子节点,V1,V2的子节点,V2,V3的子节点,V3,U]

思路一迭代

  • 手动维护一个栈,然后将根结点放入
  • 根结点拿出来,放入其子结点顺序为V1,V2,V3
  • 拿出栈顶元素,就是V3,然后放入V3的子节点
  • 以此类推

这样的遍历顺序为[U,V3,V3的子节点,V2,V2的子节点,V1,V1的子节点]
遍历顺序相反一些,就是其后序遍历顺序

代码

class Solution {
    public List<Integer> postorder(Node root) {
        LinkedList<Integer> res = new LinkedList<>();
        Stack<Node> stack = new Stack<>();
        if (root == null) {
            return res;
        }
        stack.add(root);
        while (!stack.isEmpty()) {
            Node node = stack.pop();
            res.addFirst(node.val);
            for (Node temp : node.children) {
                    stack.add(temp);
            }    
        }
        return res;
    }
}

复杂度分析

时间复杂度:O(K),其中 K是 N 叉树中的节点个数。每个节点只会入栈和出栈各一次。

空间复杂度:O(K)。在最坏的情况下,这棵 N 叉树只有 2 层,所有第 2 层的节点都是根节点的孩子。将根节点推出栈后,需要将这些节点都放入栈,共有 K−1 个节点,因此栈的大小为 O(K)。

递归

class Solution {
    public List<Integer> postorder(Node root) {
        LinkedList<Integer> res = new LinkedList<>();
        helper(root, res);
        return res;
    }
    public void helper(Node node, LinkedList<Integer> res) {
        if (node == null) {
            return;
        }
        for (Node temp : node.children) {
            helper(temp, res);
        }
        res.add(node.val);
    }
}
List<Integer> res = new LinkedList<>();
res.addFirst 这个方法找不到,res对象的类 需要为 LinkedList<Integer>,才能使用这个方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值