leetcode
leetcode 1351 ~ 1400
克隆 N 叉树

克隆 N 叉树

难度:

标签:

题目描述

代码结果

运行时间: 51 ms, 内存: 19.0 MB


/*
 * 思路:
 * 1. 使用递归来遍历原始的N叉树。
 * 2. 对于每一个节点,创建一个新的节点。
 * 3. 使用Java Stream来处理子节点的克隆和添加。
 * 4. 返回新创建的根节点。
 */
import java.util.stream.Collectors;

class Node {
    public int val;
    public List<Node> children;
    public Node() {}
    public Node(int _val) {
        val = _val;
    }
    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
}

class Solution {
    public Node cloneTree(Node root) {
        if (root == null) {
            return null;
        }
        Node newNode = new Node(root.val);
        newNode.children = root.children.stream()
                                        .map(this::cloneTree)
                                        .collect(Collectors.toList());
        return newNode;
    }
}

解释

方法:

此题解采用递归方法克隆 N 叉树。首先检查传入的节点是否为空,如果为空则返回 None。如果节点非空,它首先创建一个新的节点对象,将当前节点的值复制到新节点中。然后,对原始节点的每个子节点递归地调用克隆函数,生成克隆后的子节点列表,并将这些子节点赋值给新节点的子节点列表。这个递归过程将持续进行,直到所有的节点都被克隆完毕。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在递归克隆节点时,如果原树中存在循环引用(即节点通过其子节点间接或直接引用自己),此递归方法是否会正确处理?
在当前实现的递归方法中,如果原树中存在循环引用,该方法将不会正确处理。递归方法会因为无限递归而导致栈溢出错误(stack overflow)。要处理循环引用,我们可以使用一个哈希表来存储已经访问过的节点和它们的克隆副本。在每次递归调用之前,首先检查当前节点是否已经被克隆过,如果是,则直接从哈希表中取出克隆节点,避免重复递归,从而处理循环引用的问题。
🦆
递归方法中,您是如何保证所有属性(例如节点的`val`和`children`)都被正确复制且保持其原有结构的?
在递归方法中,我们首先创建一个新的节点对象,并将当前节点的`val`属性复制到新节点中,这确保了节点值的正确复制。对于`children`属性,我们通过对原节点的每个子节点递归调用克隆函数,并将结果(克隆后的子节点列表)赋值给新节点的`children`属性。这个过程确保了子节点列表的每个元素都被递归地克隆且保持了原有的结构。
🦆
在递归克隆的过程中,如何处理异常情况,例如原树中某些节点的`children`属性为非法值(如`None`或非列表)?
在当前的实现中,构造函数`Node`确保如果`children`参数为`None`,它将被初始化为空列表。这种设计可以防止`None`值导致的错误。如果`children`包含非列表类型,这将违反`Node`类的预期用法。在实际应用中,应当在添加节点前验证数据类型,确保`children`总是一个列表。如果需要增强代码的健壮性,可以在克隆方法中添加类型检查,确保`children`属性值的类型正确,从而避免非法类型导致的运行时错误。
🦆
递归深度与树的结构(如高度、平衡性等)具有怎样的关联?在极端不平衡的树中,这种克隆方法的效率如何?
递归深度直接受树的高度影响。在高度平衡的树中,递归深度相对较浅,算法效率较高。在极端不平衡的树中,如所有节点都只有一个子节点的线性结构,递归深度与节点数相等,可能导致较高的递归开销。在这种情况下,递归方法的效率较低,因为每增加一个节点,递归深度就增加一层,可能导致栈溢出。在处理极端不平衡的树时,使用迭代方法(例如使用栈)可能更为有效,以避免深层递归带来的性能问题。

相关问题