Pergunta

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);
 }

Ok Eu estou tentando criar esta Traversal via recursão. Na verdade, eu postou este problema antes, mas eu estava indo sobre tudo errado devido a mim ter que usar um ponteiro de função. Eu não entendo o que estou a fazer supor. Eu tenho o wrapper público que exorta a um privado ... mas o público é o único com a função que está sendo passado em então o que eu mesmo fazer com ele ?? Eu me sinto retardado por isso mesmo que alguém fosse me dar uma pequena dica que eu tenho certeza que eu entendo. Eu só não sei para onde ir a partir daqui.

um exemplo de código que chama nele é esta:

first.inOrder(print_val)
Foi útil?

Solução

Esta é a forma de fazê-lo corretamente, mas Node :: GetItem precisa implementar para que este seja 100% correto:

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);
 }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top