我最近遇到了一些用于二叉搜索樹的中序遍歷的代碼,如下所示:
void binary_search_tree::inorder_traversal(bst_node *node, std::function<void(int)> callback) {
if (node == nullptr) {
return;
}
inorder_traversal(node->left, callback);
callback(node->value);
inorder_traversal(node->right, callback);
}
std::vector<int> binary_search_tree::get_elements_inorder() {
std::vector<int> elements;
inorder_traversal(root, [&](int node_value) {
elements.push_back(node_value);
});
return elements;
}
根據我的理解,第一個函式遞回遍歷 BST 順序,訪問左側,然后是節點,然后是右側。然后,第二個函式呼叫此函式以在每個節點被命中時將每個元素添加到向量中。
我的困惑來自如何獲得節點的每個值。是否callback(node->value)將每個節點值存盤在某個地方以供以后使用?我不太確定這是如何作業的。
任何幫助將不勝感激:) 謝謝!
uj5u.com熱心網友回復:
https://en.cppreference.com/w/cpp/utility/functional/function有一個很好的描述:
類模板 std::function 是一個通用的多型函式包裝器。std::function 的實體可以存盤、復制和呼叫任何 CopyConstructible Callable目標——函式、lambda 運算式、系結運算式或其他函式物件,以及指向成員函式的指標和指向資料成員的指標。
std::function<void(int)>存盤可以使用int引數呼叫并且不回傳任何內容的函式(或類似函式)。特別是您可以在其中存盤一個 lambda。
這里inorder_traversal以 lambda[&](int node_value) { elements.push_back(node_value); }作為引數呼叫函式(在 name 下callback)。
然后稍后在inorder_traversal呼叫callback(node->value);它時有效地呼叫代碼elements.push_back(node->value)。不完全是,因為這僅在 lambda 已捕獲 elements時才有效- 否則該向量將無法在此處訪問。但是要更多地了解它是如何作業的,我建議你閱讀 lambdas - 這有點超出了這個問題的范圍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/488660.html
