Я получаю эту ошибку, может кто-нибудь сказать мне, почему это так?
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. Вы не должны читать входные данные из stdin / console. Есть несколько тестовых случаев. Для каждого теста этот метод будет вызываться индивидуально.
Вход: задача состоит в том, чтобы завершить метод LCA, который принимает 3 аргумента,
корень дерева и два узла значения n1 и n2. Узел структуры имеет
часть данных, в которой хранятся данные, указатель на левого потомка и указатель
чтобы правильно ребенок. Есть несколько тестовых случаев. Для каждого теста
этот метод будет вызываться индивидуально.Вывод: функция должна возвращать узел, который является наименее распространенным
предок двух узлов n1 и n2.Ограничения: 1 <= Т <= 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)
Обратите внимание, что остальная часть вашей функции выглядит странно, и я думаю, что у вас могут быть другие проблемы, но это позволит вам сосредоточиться на них, пройдя мимо ошибки компилятора.
Не часть ответа, а информация о том, как использовать Stack OVerflow, который не помещается в комментарии:
Причина, по которой вас так сильно понизили, возможно, в том, что вы спросили, почему произошла ошибка, когда это не совсем то, что вы хотели. Сообщение об ошибке довольно ясно об этом; Я объясню это более подробно в первых двух параграфах моего ответа, но большинство программистов на C ++ уже знают большинство из них, это конкретное сообщение об ошибке было относительно ясным, и неясно, какую часть вы не понимаете. Если часть этого сбивает с толку, вам лучше спросить о эта конкретная часть (например, «О каком сравнении идет речь?» или «Почему это не разрешено?»); Кроме того, так как вы также хотите получить информацию о том, как фиксировать это полезно, если вы объясните, что вы хотите сделать и почему.