С++ Binary Tree: возвращает число потомков узла. Лист имеет нуль. Верните -1, если TreeData не найден

125
16

Возвращает число потомков узла, сохраняющего символ в дереве. Лист имеет нулевых потомков. Верните -1, если TreeData не найден. У меня есть метод, который находит узел, с которого мы начинаем. Если он не находится в дереве, он вернет -1. Затем из этого узла мне нужно подсчитать количество потомков, и я застрял. Это то, что у меня есть до сих пор.

int BSTree::descendants(const TreeData &item) const
{
Node* foundNode; // pointer to the node we're looking for
if(!(findNode(item, root, foundNode)))
{
return -1; // return -1 if not found
}
else
{
return descendants(foundNode);
}
}

int BSTree::descendants(Node *root) const
{
if(root->left == NULL && root->right == NULL)
{
return 0;
}
// Need more here

}

// helper method that finds the node we are looking for to start counting
// descendants from and stores it to foundNode
bool BSTree::findNode(const TreeData &item, Node *root, Node *&foundNode) const
{
if(root == NULL)
{
return false;
}
else if(item == *root->item)
{
foundNode = root;
return true;
}
else if(item < *root->item)
{
findNode(item, root->left, foundNode);
}
else
{
findNode(item, root->right, foundNode);
}
}

спросил(а) 2021-01-25T13:50:14+03:00 4 месяца, 3 недели назад
1
Решение
77

Учитывая допустимый узел, вам нужно подсчитать как его левое, так и правое дочерние элементы (двоичное дерево):

int BSTree::descendants(const Node *root) const
{
if (!root)
{
return 0;
}
return 1 + descendants(root->left) + descendants(root->right);
}

Вместо проверки, если данный узел является листом, просто проверьте, является ли указатель, который вы передаете, NULL или нет (в этом случае, почему NULL если вы пишете C++? Предпочитаете nullptr если вы можете использовать C++ 11 или выше). Это автоматически обработает случай листа, так как оба descendants(root->left) и descendants(root->right) вернут 0.

Примечание. Функция вернет число потомков + 1 в конце

ответил(а) 2021-01-25T13:50:14+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема