Я пытаюсь вернуться в C ++, так как я не использую его в течение года +.
Я пытаюсь выполнить задания на этом сайте: www.testdome.com
В настоящее времяМоя задача - найти значение в отсортированном бинарном дереве.Класс Node
, который я должен использовать, выглядит следующим образом:
class Node
{
public:
Node(int value, Node* left, Node* right)
{
this->value = value;
this->left = left;
this->right = right;
}
int getValue() const
{
return value;
}
Node* getLeft() const
{
return left;
}
Node* getRight() const
{
return right;
}
private:
int value;
Node* left;
Node* right;
};
Я выполнил задание и предложил две реализации.В обоих тестах я получаю сообщение об ошибке: Превышен лимит времени
Я хотел бы знать, как это можно написать быстрее.Мои реализации:
1.Используя std::stack
для работы со всеми узлами
Я сохраняю вложенные узлы в std::stack
и перебираю их, пока не достигну значения.Я думаю, что это должно быть правильным решением, избегая реальной рекурсии.
bool containsStdStack(const Node& root, int value)
{
std::stack<const Node*> queue;
queue.push(&root);
while(!queue.empty()) {
const Node*const tmp = queue.top();
queue.pop();
if(tmp->getValue() == value) {
return true;
}
// Do not push nulls to avoid extra iterations
if(const Node* left = tmp->getLeft()) {
queue.push(left);
}
if(const Node* right = tmp->getRight()) {
queue.push(right);
}
}
return false;
}
2.Наивный рекурсивный подход
Поскольку вышеописанное не прошло тест на производительность, я попробовал этот наивный подход - простые решения часто оказываются быстрее, чем ожидалось.
bool containsRecursive(const Node&root, int value) {
return containsRecursive(&root, value);
}
bool containsRecursive(const Node*root, int value) {
return root!=nullptr &&(
root->getValue() == value
|| containsRecursive(root->getLeft(), value)
|| containsRecursive(root->getRight(), value)
);
}
Но все равно это не такпройти тест производительности.
Я что-то упустил? А может, тест производительности действительно суров?Можно ли это оптимизировать дальше без хаков?