我收到此错误,谁能告诉我为什么会这样?
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)
比较是错误的,因为n1
和n2
是int
类型,而root
是Node*
类型
您可能正在尝试与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 == n1
和root == n2
.
如果你看一下这些变量的声明位置,你会发现root
是一个Node*
,意思是"指向Node
的指针",n1
和n2
是int
s,代表"整数"。因此,这两个比较都试图将指针(root
(与整数(n1
或n2
(进行比较,错误告诉你这是不允许的。
您可以将指针视为变量的电话号码(通常的比喻是地址,但电话号码在这种情况下效果更好(,而int
只是一个数字。您可以将电话号码视为int
(例如,如果电话号码为 555-867-5309,则可以假装它是号码 5,558,675,309(,但您很少希望这样做,因此C++尝试时会明确表示。你正在做的就像问"电话号码root
和我传递的这个号码一样";从理论上讲,这是您可能想做的事情,但这可能不是您真正想要的。
在这种情况下,您要做的是(可能;我不确定问题所在(隐喻地"打电话"root
并通过获取root->data
来询问它知道的号码是什么.因此,您想要的行可能是
if (root->data == n1 || root->data == n2)
请注意,函数的其余部分看起来很奇怪,我认为您可能还有其他问题,但这可以让您通过克服编译器错误来专注于这些问题。
不是答案的一部分,而是有关如何使用不适合注释的堆栈OVerflow的信息:
你被否决的原因可能是因为你问为什么会发生错误,而这不是你想要的。错误消息对此非常清楚;我在回答的前两段中更详细地解释了它,但大多数C++程序员已经知道了大部分,这个特定的错误消息相对清晰,不清楚你不理解哪一部分。如果其中的一部分令人困惑,你最好询问该特定部分(例如"它在谈论什么样的比较?"或"为什么不允许这样做?"(;此外,由于您还需要有关如何修复它的信息,因此如果您解释要做什么以及为什么这样做会很有帮助。