Algorithm 如何复制包含循环的完整非二叉树
请与我分享您对复制完整非二叉树问题的想法和任何解决方案,其中可能还包括一些子节点连接到其他父节点的循环 例如: 这里,A是根或父级,它的子级通常是B和C,最后,子级G连接回它的父级B,类似地,I连接到它的直接父级C,因此这些都像A循环,这也需要按原样复制到新树中。因此,这里我们需要额外的逻辑来识别循环,同时复制子节点,而不是进入无限循环,并最终返回整个树的副本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
- 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;
}
如果有一个循环,我不相信它是一棵树,它是一个图形。似乎您要克隆一个图形。你可以看看一个图是如何被克隆的。一个有圈的树是矛盾的。