[英]C++ Binary Tree Traverse and Function Pointer Parameter
我要做的是按顺序遍历该节点,以便可以按顺序在二叉树中打印该节点。
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);
谢谢,我将不胜感激。
您可以取消访问,因为该功能只是执行与“当前”节点有关的任何操作。 因此,您只需将呼叫替换为打印数据即可:
void inorder_traverse(node* root)
{
if (root == nullptr) return;
inorder_traverse(root->left);
cout << root->data << ", ";
inorder_traverse(root->right);
}
考虑一下您在遍历函数中正在执行的操作,即将节点值发送到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回调机制。 但我希望您了解它现在是如何工作的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.