【力扣题解】P590-N叉树的后序遍历-Java题解

花无缺

👨‍💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创

收录于专栏 【力扣题解】



【力扣题解】P590-N叉树的后序遍历-Java题解

P590.N叉树的后序遍历

🌏题目描述

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

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

示例 1:

在这里插入图片描述

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

示例 2:

在这里插入图片描述

输入: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]

提示:

  • 节点总数在范围 [0, 104]
  • 0 <= Node.val <= 104
  • n 叉树的高度小于或等于 1000

💡题解

递归法

public List<Integer> postorder(Node root) {
    // 树为空, 返回空列表
    if (root == null) return new ArrayList<>();
    List<Integer> res = new ArrayList<>();
    // 调用递归函数 order, 后序递归遍历 N 叉树
    order(root,res);
    return res;
}
// 递归法
public void order(Node root, List<Integer> list) {
    // 根节点为空, 递归终止
    if (root == null) return;
    // 按从左到右的顺序递归遍历当前节点(根节点)的孩子节点
    for (Node child : root.children) {
        order(child,list);
    }
    // 遍历根节点
    list.add(root.val);
}

时间复杂度:O(n),需要访问 N 叉树的所有节点,节点数为 n,每个节点访问一次。

迭代法

public List<Integer> postorder(Node root) {
    // 树空, 返回空列表
    if (root == null) return new ArrayList<>();
    List<Integer> res = new ArrayList<>();
    // 使用 Deque 模拟一个栈存储 N 叉树的节点
    Deque<Node> stack = new LinkedList<>();
    // 根节点先进栈
    stack.offerLast(root);
    while (!stack.isEmpty()) {
        Node node = stack.pollLast();
        // 将栈顶(根)节点加入结果列表
        res.add(node.val);
        // 将当前节点(根节点)的孩子节点入栈
        // 在这里我们入栈的顺序是: 根->左边的孩子节点->右边的孩子节点
        // 出栈的时候的顺序就是: 根->右边的孩子节点->左边的孩子节点
        for (Node child : node.children) {
            stack.offerLast(child);
        }
    }
    // 翻转列表元素的顺序
    // 此时列表中元素的顺序就对应节点的后序遍历顺序: 左边的孩子节点->右边的孩子节点->根
    Collections.reverse(res);
    return res;
}

时间复杂度:O(n),需要访问 N 叉树的所有节点,节点数为 n,每个节点访问一次。

🌏总结

不管是 N 叉树的递归遍历还是迭代遍历,其算法思路和二叉树的递归和迭代都是一样的,递归算法是利用一个隐藏的栈来实现树的遍历,而迭代算法是显式实现一个栈来模拟递归的过程。

对于 N 叉树的后序遍历递归法,我们是先递归遍历根节点的各个孩子节点,然后再遍历根节点。

对于 N 叉树的后序遍历的迭代法,我们手动实现一个栈,然后先让根节点进栈,之后根节点出栈,出栈过程中执行我们需要的遍历操作,然后把当前节点的孩子节点入栈,但是孩子节点的入栈顺序是有严格要求的,对于后序遍历来说,我们要先从靠近树左边的节点入栈,一直到树的最右边的节点入栈。

此时节点入栈的顺序是:根->左边的孩子节点->右边的孩子节点,出栈的顺序就是:根->右边的孩子节点->左边的孩子节点,然后我们翻转列表中节点值,顺序就变为:左边的孩子节点->右边的孩子节点->根节点,这样就达到了后序遍历 N 叉树节点的效果。

作者:花无缺(huawuque404.com)


🌸欢迎关注我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
🍻一起进步-刷题专栏:【力扣题解】
🥇往期精彩好文:
📢【CSS选择器全解指南】
📢【HTML万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢!

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值