复制图节点以进行节点网络的全新复制

时间:2012-07-14 01:56:43

标签: java algorithm data-structures graph

获取节点并复制此节点以及所有相邻节点的函数,以创建与此节点完全相似的新结构。

一个
 / \
B C-E
 \ /
  d

应该使用新节点创建类似的网络

Node对象由

定义

节点{

Arraylist邻居; //返回数组列表中的所有相邻节点

}

此代码是否有效?

public Node copyGraph(Node A){
    HashTable<Node, Node> hash = new HashTable<Node, Node> ();

    return copyGraphWithHash(A, hash);

}

public Node copyGraphWithHash(Node A, HashTable<Node, Node> hash){


  if (A.neighbours.size() == 0)
    return null;

  Node newfirst = null;

  if(!hash.hasKey(A))
    newfirst = new Node();
    hash.add(A,newfirst);
  }


  for ( Node n : A.neighbours()){

   if (copyGraphWithHash(n, hash))
         newfirst.neightbours.add(copyGraphWithHash(n, hash));
  }
  return newfirst;
 }

请告诉我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

此代码将以抛出堆栈溢出异常结束。

问题:

  • 错误的基本情况:只要你有一个包含至少2个节点的图形,你就会有一个无限递归,因为在每种情况下你总是会为每个孩子调用递归函数。
  • 错误的递归情况:在某些情况下,在循环中调用递归函数两次
  • 如果图表只有一个节点,则行为错误:它不会重复

解决方案:

  • 删除对邻居的测试
  • 如果哈希表包含已处理的节点,则直接返回重复的节点
  • 如果没有,请创建一个新节点,在表中添加对应关系,并且不要忘记初始化邻居变量
  • 在循环中,删除测试并始终填充邻居变量

其他潜在问题:

  • 递归函数是公共的。如果我们不需要提供预先填写的哈希表,则不应该公开
  • 在非多线程上下文中使用散列表而不是散列映射
  • 如果A为空,则无错误管理