ошибка: ISO C ++ запрещает сравнение между указателем и целым числом [-fpermissive]

Я получаю эту ошибку, может кто-нибудь сказать мне, почему это так?

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
}

-4

Решение

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.
2

Другие решения

В вашем коде есть ошибка вырезания / вставки: if (root == n1 || root == n2) должно было:

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

Боюсь, этот программный тест очень низкого качества.

0

Ваша линия if (root == n1 || root == n2), Сообщение об ошибке «ISO C ++ запрещает сравнение между указателем и целым числом». В этом контексте «сравнение» является любым из ==, !=, <, <=, >, или же >=, У вас есть два из них на ссылочной линии; root == n1 а также root == n2,

Если вы посмотрите, где эти переменные объявлены, вы увидите, что root это Node*, что означает «указатель на Node«, а также n1 а также n2 являются ints, что означает «целое число». Таким образом, оба сравнения пытаются сравнить указатель (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 ++ уже знают большинство из них, это конкретное сообщение об ошибке было относительно ясным, и неясно, какую часть вы не понимаете. Если часть этого сбивает с толку, вам лучше спросить о эта конкретная часть (например, «О каком сравнении идет речь?» или «Почему это не разрешено?»); Кроме того, так как вы также хотите получить информацию о том, как фиксировать это полезно, если вы объясните, что вы хотите сделать и почему.

0
По вопросам рекламы [email protected]