我正在创建一个二叉搜索树模板类,并想为中序遍历函数使用函数指针,我对函数指针没问题,但由于某种原因,一旦代码就位,我就不知道如何使用中序了。网上没有太多其他东西对我有帮助,所以任何反馈都会很棒。
class Bst
{
struct Node
{
T data;
Node * left;
Node * right;
Node(T key) :data(key), left(nullptr), right(nullptr) {}
};
typedef void(*inorderPtr)(T &);
typedef void(*preorderPtr)(T &);
typedef void(*postorderPtr)(T &);
Node * root;
T & GetItem() const;
void deleteNode(Node*);
void printNode(Node*);
void inorder(Node * root, void (*inorderPtr)(T &)) const;
void preorder(Node * root) const;
void postorder(Node * root) const;
public:
Bst();
~Bst();
Bst(const Bst<T> & source);
const Bst<T> & operator = (const Node &);
void insert(const T);
void print();
void inorder(void(*inorderPtr)(T &)) const;
void printPreorder() const;
void printPostorder() const;
};
基本bst的部分代码如下
template<class T>
inline T & Bst<T>::GetItem() const
{
return data;
}
template<class T>
inline void Bst<T>::inorder(Node * root, void(*inorderPtr)(T &)) const
{
if (root->left != nullptr)
{
inorder(root->left, inorderPtr);
}
inorderPtr(root->GetItem());
if (root->right != nullptr)
{
inorder(root->right, inorderPtr);
}
}
template<class T>
inline void Bst<T>::inorder(void(*inorderPtr)(T &)) const
{
inorder(this->root, inorderPtr);
}
int main()
{
Bst<int> tree;
for (int i = 0; i < 100; i++)
{
tree.insert(i);
}
tree.inorder();
}
主要是基本测试,但在使用 inorder() 时遇到问题;没有足够的参数
最佳答案
假设您要打印树中每个节点的值:
void value_printer(int& value)
{
std::cout << "Value is " << value << '\n';
}
int main()
{
Bst<int> tree;
// Insert nodes...
tree.inorder(&value_printer);
}
您在 inorder
调用中传递了一个指向 value_printer
函数的指针。然后将为遍历中的每个节点调用该函数。
当然,您传递指针的函数可以做其他事情。正如目前声明的那样,您甚至可以修改树的值。
了解更多关于 std::function
的信息和 lambda expressions .另见 this回答。
关于c++ - 遍历bst使用函数指针的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56231912/