【问题标题】:Closest Ancestor function that works with data rather than node pointers使用数据而不是节点指针的最近祖先函数
【发布时间】:2013-06-07 14:25:13
【问题描述】:

我正在编写一个程序来查找二叉树(不是 BST)中最近的祖先。我找到了一个示例工作代码:

mynode *closestAncestor(mynode* root, mynode* p, mynode* q)
{
   mynode *l, *r, *tmp;

   if(root == NULL)
   {
      return(NULL);
   }

 if(root->left==p || root->right==p || root->left==q || root->right==q)

   {
     return(root);
   }
   else
   {
      l = closestAncestor(root->left, p, q);
      r = closestAncestor(root->right, p, q);

      if(l!=NULL && r!=NULL)
      {
        return(root);
      }
      else
      {
         tmp = (l!=NULL) ? l : r;
         return(tmp);
      }
   }
}

我正在尝试执行以下操作(仅传递数据值并仅查找祖先的数据值,而不关心其指针)

int closestanc(node * root, int n1, int n2)
{
    int l, r;
    if(root == NULL)
        return -1;
    if(root->right->data == n1 || root->right->data == n2 || root->left->data == n1 ||     root->left->data == n2)
        return root->data;
    else
    {
        l = closestanc(root->left, n1, n2);
        r = closestanc(root->right, n1, n2);
        if(l!= -1 && r!= -1)
            return root->data;
        else
            return (l != -1 ? l : r);
    }
}

【问题讨论】:

  • 我可能没有正确阅读问题,但问题是什么?只需在标题或问题中澄清它..

标签: c algorithm tree


【解决方案1】:

您需要检查NULLs。变化:

if(root->right->data == n1 || root->right->data == n2 ||
   root->left->data  == n1 || root->left->data  == n2)

if ((root->right != NULL && (root->right->data == n1 || root->right->data == n2))
 || (root->left  != NULL && (root->left->data  == n1 || root->left->data  == n2)))

虽然我怀疑你可以用更简单的替换它:

if (root->data == n1 || root->data == n2)

不改变函数将输出的内容(尽管它会稍微改变它的工作方式)。

补充说明:

该功能不太可靠。似乎如果两者都不存在于树中,它仍然会返回一个祖先。为此,我建议返回 -2(或另一个未使用的值)而不是 root->data; 进行上述检查,以便您可以确定何时都找不到。

所以:

if (root->data == n1 || root->data == n2)
    return -2;

然后:

  • 如果函数返回-1,则说明没有找到任何元素。
  • 如果返回-2,则只找到其中​​一个。
  • 如果它返回任何其他值,那就是最近的祖先。

【讨论】:

    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 2016-03-26
    • 2016-04-14
    • 2022-11-17
    • 2020-04-20
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    相关资源
    最近更新 更多