【力扣题解】P589-N叉树的前序遍历-Java题解

2023-12-26 12:36:48

花无缺

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

收录于专栏 【力扣题解】



【力扣题解】P589-N叉树的前序遍历

P589.N叉树的前序遍历

🌏题目描述

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

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

示例 1:

在这里插入图片描述

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

示例 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]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]

提示:

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

💡题解

递归法

public List<Integer> preorder(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;
    // 遍历根节点
    list.add(root.val);
    // 按从左到右的顺序递归遍历孩子节点
    for (Node child : root.children) {
        order(child,list);
    }
}

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

迭代法

public List<Integer> preorder(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 (int i = node.children.size() - 1; i >= 0; i--) {
            Node child = node.children.get(i);
            stack.offerLast(child);
        }
    }
    return res;
}

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

🌏总结

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

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

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

代码实现:

for (int i = node.children.size() - 1; i >= 0; i--) {
    Node child = node.children.get(i);
    stack.offerLast(child);
}

为什么要从最右边的节点开始入栈呢,因为这样的话,对应 N 叉树节点的入栈顺序就是:根->右边的孩子节点->左边的孩子节点,而出栈遍历的时候的顺序就会符合前序遍历的顺序:根->左边的孩子节点->右边的孩子节点,这样我们就借助栈实现了对 N 叉树的前序遍历。

作者:花无缺(huawuque404.com)


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

文章来源:https://blog.csdn.net/huawuque404/article/details/135218714
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。