[英]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.