我正在编写一个程序来查找二叉树中最近的祖先(不是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);
}
}
答案 0 :(得分:1)
您需要检查NULL
。变化:
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
,则只找到其中一个。