簡體   English   中英

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);
   }

我看到了用於遍歷二叉樹的代碼。 遍歷所有節點,所以我認為我可以使用遍歷功能打印所有已訪問節點的所有數據。 能行嗎? 我很困惑多態函數參數要傳遞什么。

如果我像下面那樣構造二叉樹並嘗試遍歷並打印樹中的所有數據,我應該將什么傳遞給上面的函數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM