Рекурсивный обход C++ с указателями на функции
-
03-07-2019 - |
Вопрос
template <class T>
void BT<T>::inOrder(void (*inOrderPtr)(T&))
{
inOrderPtr(inOrder(this->root));
}
template <class T>
void BT<T>::inOrder(Node<T>* root) const
{
if (root->left != NULL)
inOrder(root->left);
//something here
if (root->right != NULL)
inOrder(root->right);
}
Хорошо, я пытаюсь создать этот обход с помощью рекурсии.На самом деле я уже публиковал эту проблему раньше, но действовал неправильно из-за того, что мне приходилось использовать указатель на функцию.Я не понимаю, что мне делать.У меня есть общедоступная оболочка, которая вызывает частную...но публичный — это тот, в который передается функция, так что мне с ним вообще делать??Я чувствую себя отсталым, поэтому, даже если бы кто-то дал мне небольшой намек, я уверен, что я его пойму.Я просто не знаю, куда идти дальше.
пример кода, который его вызывает, таков:
first.inOrder(print_val)
Решение
Вот как это сделать правильно, но Node::GetItem необходимо реализовать, чтобы это было на 100% правильно:
template <class T>
T& Node<T>::GetItem() const
{
// TODO - implement getting a T& from a Node<T>
return m_item; // possible implementation depending on Node's definition
}
template <class T>
void BT<T>::inOrder(void (*inOrderPtr)(T&))
{
inOrder(this->root, inOrderPtr);
}
template <class T>
void BT<T>::inOrder(Node<T>* root, void (*inOrderPtr)(T&)) const
{
if (root->left != NULL)
inOrder(root->left, inOrderPtr);
inOrderPtr(root->GetItem());
if (root->right != NULL)
inOrder(root->right, inOrderPtr);
}
Не связан с StackOverflow