Функция, которая проверяет, имеет ли дерево только нечетные числа C ++ - PullRequest
1 голос
/ 12 января 2020

Итак, у нас есть дерево с узлами, в которых хранятся числа.

{
    int data;
    treeNode* child;
    treeNode* sibling;

    treeNode(int data) :data(data), child(nullptr), sibling(nullptr) {}
    treeNode() {}
};

Я пытаюсь проверить, хранит ли каждый узел нечетное число. Пример:

           1 -- 3
          / \
         5   7

Здесь 1 - это root, а остальные - его потомков , и функция должна возвращать true.

private:
bool isOdd(treeNode* node)const
    {
        if (!node) //I think the problem might be here but I don't really know how to fix it
            return true;
        if (node->data % 2 == 0)
            return false;
        return isOdd(node->child);
        return isOdd(node->sibling);
    }
public:
bool isOdd()const
    {
        if (root->data % 2 == 0)
            return false;

        return isOdd(root->child);
    }

Как показано выше, я использую рекурсию, но я также хочу использовать итеративный подход.

Заранее спасибо!

1 Ответ

2 голосов
/ 12 января 2020

После этой строки

return isOdd(node->child);

вводится следующая, потому что, как прокомментировал Иксисарвинен, после выполнения одного оператора return функция выполнена, больше ничего не будет выполнено.
Т.е.

return isOdd(node->sibling);

не повлияет на результат, т.е. брат игнорируется.

Чтобы всегда возвращать что-то, на что влияют обе части, вам нужна логическая c операция

return (isOdd(node->sibling) && isOdd(node->child));

С другой стороны, ваш код

if (!node) return true;

мне кажется вполне подходящим. Если вы анализируете указатель, который указывает на ничто (без разыменования, хорошо), то имеет смысл сказать, что «ничто» не может сломать «все странное», поэтому возвращение true имеет смысл для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...