c++ - 遍历bst使用函数指针的正确方法

标签 c++ binary-search-tree function-pointers traversal inorder

我正在创建一个二叉搜索树模板类,并想为中序遍历函数使用函数指针,我对函数指针没问题,但由于某种原因,一旦代码就位,我就不知道如何使用中序了。网上没有太多其他东西对我有帮助,所以任何反馈都会很棒。

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/

相关文章:

c++ - 计算给定起点、角度和长度的目标点 走向相反的方向

c++ - 如何在OpenAcc计算区域中直接(不使用指针作为函数参数)访问GPU上的数组?

c++ - 大数组大小的段错误

c++ - 如何在添加后 30 秒内从链表中删除项目?

c - 用C语言将二叉树结构写入文件

添加节点时出现 C++ 二进制搜索树状态访问冲突错误

c - 通过字符串指向函数的指针

C函数指针

algorithm - 字符串的二叉搜索树(平衡前)

c++ - 使用 std::bind 时从 std::function 获取函数指针