Проблема состоит в том, чтобы определить, равна ли сумма дочерних данных родительским данным. если да, верните истину, иначе верните ложь.
Ниже мой код, который выдает ошибку при отправке. Я знаю, что это простой вопрос, но после написания условия у меня возникли трудности с тем, как рекурсивно проверить условие суммы для каждого узла в двоичном дереве, пройдя все левые и правые узлы.
int isSumProperty(Node *node)
{
if (node == NULL) return 0;
if ((node->left->data + node->right->data) == node->data)
{
return 1;
}
else
{
return isSumProperty(node->left)&&isSumProperty(node->right);
}
}Пожалуйста, объясните мне, где я делаю неправильно.
я имею в виду непосредственного ребенка. я получаю ошибку сегментации





Вы получаете доступ к node->left->data, не проверяя, что node->left не является NULL.
Это приводит к ошибке сегментации.
да исправить. Я позабочусь об этой ситуации, и после этого, как мне рекурсивно вернуть два значения, одно для левого, а другое для правого?
@ user2978343 Спрошу еще раз. Что именно нужно вернуть? Если это ответ для root, вы уже это делаете. Если вопрос в том, удовлетворяет ли этому какой-либо узел в дереве, тогда вы можете использовать or между результатами left и right. Но сначала, в чем, собственно, вопрос?
Мне очень жаль, Мерлин. я должен вернуть 1, если сумма дочернего родителя равна, иначе вернуть 0. Я уже упоминал об этом в начале своего вопроса
@ user2978343 В таком случае, почему вы рекурсивно обращаетесь к детям. Если сумма левого и правого не равна корню, ответ должен быть 0, верно?
Кроме того, у меня есть еще одно сомнение: если я встречу листовой узел, я должен вернуть false, верно?
Я должен пройти по всем дочерним элементам в дереве для проверки условия, если все узлы удовлетворяют этому условию, верните true, иначе верните false.
@ user2978343 ок. Тогда вы должны выполнять рекурсию только в том случае, если корень удовлетворяет свойству. Потому что если рута нет, то еще что-то проверять бессмысленно.
да, я не думал об этом. Оцените ваше понимание этого. У меня есть последнее сомнение. Если я встречу листовой узел, я должен вернуть истину или ложь?
@ user2978343 Я бы предположил, что это правда, но, опять же, я ожидаю, что именно об этом будет прямо сказано в вопросе.
Фактически, было упомянуто, что для NULL дочерних элементов значение данных считается равным нулю, тогда в этом случае разрешается листовой узел с родительскими данными равным 5, а его дочерние данные будут равны 0, в этом случае сумма не равна, верно? тогда мы должны вернуть false?
@ user2978343 Но тогда ответ всегда будет ложным. В конце концов, у каждого дерева будут листья. Если у всего нет данных 0, это не может работать. Я предполагаю, что листья считаются истинными по умолчанию.
Понятно. Спасибо. мой код был принят, и, как вы сказали, листья по умолчанию считаются верными.
Ваш вопрос довольно непонятный. Под данными о потомках подразумевают непосредственных потомков или всех потомков? Какую ошибку вы получаете?