错误:ISO C++禁止在指针和整数 [-fallowive] 之间进行比较



我收到此错误,谁能告诉我为什么会这样?

error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
if (root == n1 || root == n2)

请注意,这是功能问题,即 只需以函数的形式编写解决方案。 用于调用/调用函数的驱动程序代码将由 GfG 的在线评判器添加。

这是代码:

/* A binary tree node
struct Node
{
int data;
Node* left, * right;
}; */
/*you are required to 
complete this function */
Node * LCA(Node* root ,int n1 ,int n2 )
{
if(root==NULL) 
{
return NULL;
}
if(root==n1||root==n2)
{
return root;
}
Node* left=LCA(root->left,n1,n2);
Node* right=LCA(root->right,n1,n2);
if(root->left!=NULL&&root->right!=NULL)
{
return root;
}
if(root->left==NULL&&root->right==NULL)
{
return NULL;
}
return left!=NULL?left:right;
//Your code here 
}
if(root==n1||root==n2)

比较是错误的,因为n1n2int类型,而rootNode*类型

您可能正在尝试与int数据进行比较

如果您的Node实现是

struct Node {
int data;
struct Node *next;
};

正如您的函数所做的那样Node *root;

你可以做

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

阅读链接后提供您的解决方案

仅对于其他用户,用户提供的链接有以下问题

给定一个二叉树和 2 个节点值 n1 和 n2,您的任务是找到两个节点的最低共同祖先。您需要完成 LCA 功能。您不应该从标准/控制台读取任何输入。有多个测试用例。对于每个测试用例,将单独调用此方法。

输入:任务是完成方法LCA,该方法需要3个参数, 树的根和两个节点值 n1 和 n2。结构节点具有 存储数据、指向左子项的指针和指针的数据部分 到右孩子。有多个测试用例。对于每个测试用例, 此方法将单独调用。

输出:函数应返回最不常见的节点 两个节点 n1 和 n2 的祖先。

约束:1 <= T <= 30,1 <= 节点数 <= 100 和 1 <= 节点数据 <= 1000

Node *LCA(Node *root, int n1, int n2)
{
if (root == NULL)
return NULL;
if (root->data == n1 || root->data == n2)
return root;
Node *left  = LCA(root->left, n1, n2);
Node *right = LCA(root->right, n1, n2);
if (left && right)
return root;
if (left)
return left;
else
return right;
}

示例说明

例:

Input
1
2
1 2 L 1 3 R
2 3 
Output 
1
In above example there is one  test case which represent a tree with 3 nodes and 2 edges where root is 1, left child of 1 is 2 and right child of 1 is 3. 

您的代码存在剪切/粘贴错误:if (root == n1 || root == n2)应该是:

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

恐怕这个编程测试的质量很低。

你的行是if (root == n1 || root == n2).错误消息是"ISO C++禁止指针和整数之间的比较"。在这种情况下,"比较"是==!=<<=>>=中的任何一个。您在引用的行上有两个;root == n1root == n2.

如果你看一下这些变量的声明位置,你会发现root是一个Node*,意思是"指向Node的指针",n1n2ints,代表"整数"。因此,这两个比较都试图将指针(root(与整数(n1n2(进行比较,错误告诉你这是不允许的。

您可以将指针视为变量的电话号码(通常的比喻是地址,但电话号码在这种情况下效果更好(,而int只是一个数字。您可以将电话号码视为int(例如,如果电话号码为 555-867-5309,则可以假装它是号码 5,558,675,309(,但您很少希望这样做,因此C++尝试时会明确表示。你正在做的就像问"电话号码root和我传递的这个号码一样";从理论上讲,这是您可能想做的事情,但这可能不是您真正想要的

在这种情况下,您要做的是(可能;我不确定问题所在(隐喻地"打电话"root并通过获取root->data来询问它知道的号码是什么.因此,您想要的行可能是

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

请注意,函数的其余部分看起来很奇怪,我认为您可能还有其他问题,但这可以让您通过克服编译器错误来专注于这些问题。


不是答案的一部分,而是有关如何使用不适合注释的堆栈OVerflow的信息:

你被否决的原因可能是因为你问为什么会发生错误,而这不是你想要的。错误消息对此非常清楚;我在回答的前两段中更详细地解释了它,但大多数C++程序员已经知道了大部分,这个特定的错误消息相对清晰,不清楚你不理解哪一部分。如果其中的一部分令人困惑,你最好询问该特定部分(例如"它在谈论什么样的比较?"或"为什么不允许这样做?"(;此外,由于您还需要有关如何修复它的信息,因此如果您解释要做什么以及为什么这样做会很有帮助。

最新更新