Algorithm 如何复制包含循环的完整非二叉树

Algorithm 如何复制包含循环的完整非二叉树,algorithm,data-structures,graph,tree,binary-tree,Algorithm,Data Structures,Graph,Tree,Binary Tree,请与我分享您对复制完整非二叉树问题的想法和任何解决方案,其中可能还包括一些子节点连接到其他父节点的循环 例如: 这里,A是根或父级,它的子级通常是B和C,最后,子级G连接回它的父级B,类似地,I连接到它的直接父级C,因此这些都像A循环,这也需要按原样复制到新树中。因此,这里我们需要额外的逻辑来识别循环,同时复制子节点,而不是进入无限循环,并最终返回整个树的副本 A - B - D - E - F - G --> B - C - I --> C

请与我分享您对复制完整非二叉树问题的想法和任何解决方案,其中可能还包括一些子节点连接到其他父节点的循环

例如: 这里,A是根或父级,它的子级通常是B和C,最后,子级G连接回它的父级B,类似地,I连接到它的直接父级C,因此这些都像A循环,这也需要按原样复制到新树中。因此,这里我们需要额外的逻辑来识别循环,同时复制子节点,而不是进入无限循环,并最终返回整个树的副本

A
 - B
   - D
   - E
     - F
     - G --> B
 - C
   - I --> C
   - K
此类或节点结构可以如下所示:

public class Node{
  private String value;
  private List<Node> childrens;

  public Node copyTree(Node root) {
    ...
    //return
  }
}

感谢我们的帮助。

我认为最直接的方法是保留已复制到其副本的节点的映射。然后,在创建节点的新副本之前,只需检查映射即可。像这样未经测试的东西应该会起作用:

public static Node copyTree(Node root) {
    return copyTree(root, new HashMap<>());
}

private static Node copyTree(Node root, Map<Node, Node> images) {
    Node copy = images.get(root);
    if (copy == null) {
        copy = new Node();

        // register the copy before recursing on children
        images.put(root, copy);

        // now fill in the copy
        copy.value = root.value;
        copy.children = new ArrayList<>();
        for (Node child : root.children) {
            copy.children.add(copyTree(child, images);
        }
    }
    return copy;
}

如果有一个循环,我不相信它是一棵树,它是一个图形。似乎您要克隆一个图形。你可以看看一个图是如何被克隆的。一个有圈的树是矛盾的。