[英]how to create a c++ recursive function to return a node custom object?
你好嗎?
我創建了一個 C++ 遞歸 function 以便遍歷二叉樹並打印出屬性COMPLETED = TRUE的所有節點;
它工作得很好,因為 function 的類型是 VOID,我只是打印出結果。
這是工作正常的方式:
void findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return;
}
if (lastNode->completed == true) {
cout << lastNode->word.morseWordElement << endl;
}
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
}
但我想做的是返回第一個找到的“COMPLETED”節點,而不僅僅是打印!
我嘗試過這種方式但沒有用:
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return 0;
}
if (lastNode->completed == true) {
return lastNode;
}
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
}
謝謝您的幫助。
菲利普
不確定你想要什么,但我懷疑你正在尋找的東西
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == nullptr){
return nullptr;
}
if (lastNode->completed == true) {
return lastNode;
}
auto pnt = findAndPrintFirstCompletedNodes(lastNode->left);
if ( nullptr == pnt ) {
pnt = findAndPrintFirstCompletedNodes(lastNode->right);
}
return pnt;
}
您似乎不熟悉返回值的工作原理。 線條的結果
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
在您的代碼中被忽略。 只有在第一次遞歸中的輸入完成的情況下,才會返回任何內容。 坦率地說,我想知道為什么您的編譯器沒有警告您。
我認為您的錯誤是您假設遞歸調用中的返回會導致原始調用也返回。 它沒有。 它產生一個值,然后被忽略。
看下面的代碼:
int four()
{
return 4;
}
int three()
{
four();
return 3;
}
當您調用three()
時,這里發生的情況是創建了一個值為 4 的 integer,然后丟棄,然后返回值 3。 three()
不返回 4。
嘗試這個:
treeNode * findAndPrintFirstCompletedNodes(treeNode *lastNode) {
if (lastNode == 0){
return 0;
}
if (lastNode->completed == true) {
return lastNode;
}
treeNode* node;
node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
node = findAndPrintFirstCompletedNodes(lastNode->right);
if(node) return node;
return nullptr;
}
在這里,我將遞歸調用的返回值存儲在變量node
中,並在它不是 null 指針的情況下返回它,使用 null 指針作為“未找到”。
如果當前節點既不完整,也沒有在遞歸調用中找到任何內容,我因此返回 null 指針。
您可以將其縮短為
treeNode* node;
node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
node = findAndPrintFirstCompletedNodes(lastNode->right);
return node;
甚至
treeNode* node = findAndPrintFirstCompletedNodes(lastNode->left);
if(node) return node;
return findAndPrintFirstCompletedNodes(lastNode->right);
但我選擇了上面的版本,因為它應該更好地說明這一點。
順便說一句,我建議,而不是
if (lastNode == 0){
return 0;
}
你 go 與
if (not lastNode){
return nullptr;
}
或者
if (lastNode == nullptr){
為了明確我們使用指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.