C#深复制n叉树

3

我有一个n叉树,节点的结构如下:

class Node
{
  public Node Parent = null;
  public List<Node> Children = new List<Node>();
  public string Name;
}

我需要对原树进行深拷贝,并避免在更改原树时影响新树。我只知道如何进行浅拷贝:

public Node Copy(Node original)
{
  Node newNode = new Node();
  newNode.Parent = original.Parent;
  newNode.Children = original.Children;
  newNode.Name = original.Name;

  return newNode;
}

在这种情况下,我将复制两个节点指向内存中的一个对象,当原始节点发生更改时,新节点也会发生更改。有人可以帮助我进行深度克隆吗?

这是因为并非所有属性都被复制了,它们只是在另一个对象中被引用。 - kevintjuh93
可能是 https://dev59.com/H3VD5IYBdhLWcg3wHn6d 的重复问题。这是以不同方式提出的类似问题。 - Viet Nguyen
这是因为并非所有属性都被复制了,它们只是在另一个对象中被引用。 - kevintjuh93
2个回答

1
你需要递归地完成它。而且你需要一个已创建克隆体的父元素。
public Node Copy(Node origin, Node parent = null)
{
    if (origin == null)
    {
        return null;
    }

    var result = new Node { Parent = parent, Name = origin.Name };
    result.Children = origin.Children != null ? origin.Children.Select(x => Copy(x, result)).ToList() : null;
    return result;
}

如果您只有Node而没有系统类型,这将会有所帮助。


0

使用递归进行操作。请注意,这将使第一个节点的父节点设置为null。也就是说,如果您从树的中间开始复制,则父节点将不会被维护。

public Node Copy()
{
  Node newNode = new Node();
  newNode.Name = this.Name;

  foreach(var child in this.Children)
  {
      newChild = child.Copy();
      newChild.Parent = newNode;
      newNode.Children.Add(newChild);
  }

  return newNode;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接