你好嗎?
我創建了一個 C 遞回函式,以便遍歷二叉樹并列印出屬性COMPLETED = TRUE的所有節點;
它作業得很好,因為函式的型別是 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);
}
謝謝您的幫助。
菲利普
uj5u.com熱心網友回復:
您似乎不熟悉回傳值的作業原理。線條的結果
findAndPrintFirstCompletedNodes(lastNode->left);
findAndPrintFirstCompletedNodes(lastNode->right);
在您的代碼中被忽略。只有在第一次遞回中的輸入完成的情況下,才會回傳任何內容。坦率地說,我想知道為什么您的編譯器沒有警告您。
我認為您的錯誤是您假設遞回呼叫中的回傳會導致原始呼叫也回傳。它沒有。它產生一個值,然后被忽略。
看下面的代碼:
int four()
{
return 4;
}
int three()
{
four();
return 3;
}
當你呼叫時,這里發生的事情three()是創建一個值為 4 的整數,然后丟棄,然后回傳值 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中,并在它不是空指標的情況下回傳它,使用空指標作為“未找到”。
如果當前節點既不完整,也沒有在遞回呼叫中找到任何東西,我因此回傳一個空指標。
您可以將其縮短為
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;
}
你去
if (not lastNode){
return nullptr;
}
或者
if (lastNode == nullptr){
為了明確我們使用指標。
uj5u.com熱心網友回復:
不確定你想要什么,但我懷疑你正在尋找的東西
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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411296.html
標籤:
