Javascript 寻找最近的祖先

Javascript 寻找最近的祖先,javascript,Javascript,我有一个问题,我想弄清楚,希望有人能帮我。输入如下: { "John": ["Sam", "Megan"], "Sam": ["Donna", "Josh", "Flora"], "Megan": ["Stephanie", "Nathan"] } 山姆和梅根是约翰的孩子,等等。我需要找到两个名字最接近的祖先。例如,Sam和Josh将返回Sam,Donna和Josh将返回Sam,等等。我已经完成了该部分,但问题是如果他们开始移动结构,则他们将其更改为: { "S

我有一个问题,我想弄清楚,希望有人能帮我。输入如下:

{
    "John": ["Sam", "Megan"],
    "Sam": ["Donna", "Josh", "Flora"],
    "Megan": ["Stephanie", "Nathan"]
}
山姆和梅根是约翰的孩子,等等。我需要找到两个名字最接近的祖先。例如,Sam和Josh将返回Sam,Donna和Josh将返回Sam,等等。我已经完成了该部分,但问题是如果他们开始移动结构,则他们将其更改为:

{
    "Sam": ["Donna", "Josh", "Flora"],
    "Megan": ["Stephanie", "Nathan"],
    "John": ["Sam", "Megan"]
}

那么我的代码就有问题了。有人能给我一些提示吗?我的JavaScript知识非常基础,如果有人能帮助我,那就太棒了。

查看谱系和家族树实际上是在检查树结构。因此,有一些相似之处可以利用。在树的形式中,它将是深度。在这个沿袭模型中,它将是一个代数。请注意,您已经在逻辑上这样做了(基于索引)。现在你只需要把它具体化

我不确定你是如何创作这些作品的。但当您知道顺序时,即需要将其添加到数组中或将其包装到对象中

阵列版本

对象版本

或者,一个更可取的版本是,还可以为家族系指定某种唯一标识符,以便您也可以区分它们

{
 "Sam": {
  "family":"f31460e9",
  "generation":2,
  "children":["Donna", "Josh", "Flora"]
 },
 "Megan": {
  "family":"f31460e9",
  "generation":2,
  "children":["Stephanie", "Nathan"]},
 "John": {
  "family":"f31460e9",
  "generation:1",
  "children":["Sam", "Megan"]
 }
}

我的答案是基于最低级的共同祖先算法,很容易研究。它假设您知道整个树根上的人的名字。它基本上是递归地搜索树,寻找包含这两个元素的最低节点。希望这有帮助

function findAncestor(root, p1, p2) {
   if(!root)
      return "";

   if(root == p1 || root == p2)
      return root;
   else
   {
      var count = 0;
      var lastfound = -1;
      if(fam[root]) //make sure root exists in fam
      {
          for(var i = 0; i < fam[root].length; i++)
          {
              var res = findAncestor(fam[root][i], p1, p2); //recursively search trees
              if(res)
              {
                  count++;
                  lastfound = i;
              }
          }
      }

      if(count >= 2) //found in different subtrees so this is the ancestor
         return root;
      else if(count == 1)
          return fam[root][lastfound];
      else
          return "";
   }
}
函数findAncestor(根、p1、p2){
如果(!root)
返回“”;
如果(根==p1 | |根==p2)
返回根;
其他的
{
var计数=0;
var lastfound=-1;
if(fam[root])//确保fam中存在root
{
对于(var i=0;i=2)//在不同的子树中找到,因此这是祖先
返回根;
否则如果(计数=1)
返回fam[root][lastfound];
其他的
返回“”;
}
}

您可以发布您当前尝试过的代码吗?对于本练习,“两个名字的最近祖先”到底意味着什么?Sam和Josh不会返回Sam,因为Sam不是也永远不会是自己的祖先。听起来您最初的解决方案不够通用(可能包含硬编码的结果)。作为提示,请将此结构视为一棵树(类似于祖先树)。也要阅读一些关于最低共同祖先算法和概念的内容。这是我编写的代码,我对它进行了编码,假设一切都正常安排(父母、孩子1、孩子2等),其中孩子1、2是父母的孩子,而不是(孩子1、孩子2、父母、孩子3等)在这里,孩子1,2,3是父母的孩子。我意识到如果这是C++,我最有可能使用数组来做,但是我的JS知识有限,我不太确定。
{
 "Sam": {
  "family":"f31460e9",
  "generation":2,
  "children":["Donna", "Josh", "Flora"]
 },
 "Megan": {
  "family":"f31460e9",
  "generation":2,
  "children":["Stephanie", "Nathan"]},
 "John": {
  "family":"f31460e9",
  "generation:1",
  "children":["Sam", "Megan"]
 }
}
function findAncestor(root, p1, p2) {
   if(!root)
      return "";

   if(root == p1 || root == p2)
      return root;
   else
   {
      var count = 0;
      var lastfound = -1;
      if(fam[root]) //make sure root exists in fam
      {
          for(var i = 0; i < fam[root].length; i++)
          {
              var res = findAncestor(fam[root][i], p1, p2); //recursively search trees
              if(res)
              {
                  count++;
                  lastfound = i;
              }
          }
      }

      if(count >= 2) //found in different subtrees so this is the ancestor
         return root;
      else if(count == 1)
          return fam[root][lastfound];
      else
          return "";
   }
}