1
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)
4

1 に答える 1

4

これは正しく行う方法ですが、これを 100% 正しく行うには Node::GetItem を実装する必要があります。

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);
 }
于 2008-10-16T03:17:51.403 に答える