我想要做的是按顺序遍历节点,以便我可以按顺序打印二进制树中的节点。
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);
}
我看到这个代码是为了遍历二叉树。遍历遍历所有节点,所以我认为我可以使用遍历功能打印所有被访问节点的所有数据。会有用吗?我很困惑要传递多态函数参数。
如果我构造如下所示的二叉树并尝试遍历并打印树中的所有数据,我应该将哪些内容传递给上面的函数inorder_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);
谢谢,我会非常感激。
答案 0 :(得分:1)
您可以取消访问,因为该功能只是执行您要对“当前”节点执行的任何操作。因此,您只需使用打印数据来替换呼叫:
void inorder_traverse(node* root)
{
if (root == nullptr) return;
inorder_traverse(root->left);
cout << root->data << ", ";
inorder_traverse(root->right);
}
答案 1 :(得分:1)
考虑一下你在遍历函数中做了什么,即将节点值发送到stdout,以及如何在回调函数中完成,而不是每次调用都会访问受访节点。这正是访问函数对象可以完成的任务。一个例子是:
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回调机制。但我希望你能理解它现在是如何运作的。