C++二进制树遍历和函数指针参数
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);
}
我看到了这段代码,用于遍历二叉树。遍历所有节点,所以我想我可以使用遍历函数打印所有访问节点的所有数据。它行得通吗?我很困惑该为多态函数参数传递什么。
如果我像下面这样构造二叉树,并试图遍历和打印树中的所有数据,我应该向上面的函数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);
}
相关文章:
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针