C++二进制树遍历和函数指针参数

C++ Binary Tree Traverse and Function Pointer Parameter

本文关键字:函数 指针 参数 遍历 二进制 C++      更新时间:2023-10-16

我想做的是按顺序遍历节点,这样我就可以按顺序在二进制树中打印节点。

   void inorder_traverse(node* root, function<void(node*)> visit)
   {
          if (root == nullptr) return;
          cout << root->data << ", ";
          inorder_traverse(root->left, visit);
          visit(root);
          inorder_traverse(root->right, visit);
   }

我看到了这段代码,用于遍历二叉树。遍历所有节点,所以我想我可以使用遍历函数打印所有访问节点的所有数据。它行得通吗?我很困惑该为多态函数参数传递什么。

如果我像下面这样构造二叉树,并试图遍历和打印树中的所有数据,我应该向上面的函数inder_traverse传递什么?

    struct node* root = new node(NULL);
    root->data = 10;
    root = insertion(root, 1);
    root = insertion(root, 11);
    root = insertion(root, 2);
    root = insertion(root, 12);
    root = insertion(root, 3);
    root = insertion(root, 13);
    root = insertion(root, 5);
    root = insertion(root, 20);
    root = insertion(root, 7);
    root = insertion(root, 15);

谢谢。

考虑一下您在遍历函数中所做的事情,即将节点值发送到stdout,以及如何在每次调用时都使用访问节点的回调函数中完成这一操作。这正是visit函数对象所能做的。例如:

void print_node_value(node *p)
{
    std::cout << p->data << ' ';
}

现在你的有序遍历变成了这样:

void inorder_traverse(node* root, std::function<void(node*)> visit)
{
   if (root == nullptr) 
      return;
   inorder_traverse(root->left, visit);
   visit(root); // <<== calls provided function object
   inorder_traverse(root->right, visit);
}

它是这样调用的:

inorder_traverse(root, std::function<void(node*)>(print_node_value));

注意:这并不是一个宏大的设计。看起来原作者正试图利用C++世界中的C回调机制。但我希望你现在明白它是如何运作的。

您可以取消visit,因为该函数只是执行您要对"当前"节点执行的任何操作。因此,您可以简单地用打印数据来代替呼叫:

void inorder_traverse(node* root)
{
    if (root == nullptr) return;
    inorder_traverse(root->left);
    cout << root->data << ", ";
    inorder_traverse(root->right);
}