【问题标题】:How To Copy A Full Non-Binary Tree Including Loops如何复制包含循环的完整非二叉树
【发布时间】:2018-08-23 10:32:10
【问题描述】:

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

示例:
这里,“A”是根或父级,它的子级和往常一样是“B”和“C”,最后,子级“G”连接回其祖父级“B”,类似地“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
  }
}

感谢我们的帮助。

【问题讨论】:

  • 如果有一个循环,我不再相信它是一棵树,它是一个图。看来您想克隆图表。您可以查看here 以了解如何克隆图形。
  • 有循环的树是矛盾的。

标签: algorithm data-structures graph tree binary-tree


【解决方案1】:

我认为这样做最直接的方法是保留已复制到其副本的节点的映射。然后在制作节点的新副本之前检查地图。这样的东西(未经测试)应该可以工作:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2017-01-20
    • 2019-03-09
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多