2010-10-17 117 views
0

我想在我的代碼中創建一個循環結構方法來遍歷二叉搜索樹。但是我在編譯時遇到錯誤,並且不確定原因。在C++中聲明一個struct方法

我在.h文件

Node* BSTree::findNode(const Node* current, const Object &target){ 
if(*current->item == target) 
    return current; 

Node* temp = NULL; 

if(current->nodeLeft != NULL){ 
    temp = findNode(current->nodeLeft, target); 

    if(temp != NULL) 
     return temp; 
} 

if(current->nodeRight != NULL){ 
    temp = findNode(current->nodeRight, target); 

    if(temp != NULL) 
     return temp; 
} 
return NULL; 

} 
在CPP

的私人部分得到Node* findNode(const Node *, const Object &);

我產生了以下錯誤:

- 錯誤C2143:語法錯誤:缺少 ';'之前'*'
-error C4430:缺少類型說明符 - 假定爲int。注意:C++不支持default-int
-error C4430:缺少類型說明符 - 假定爲int。注意:C++不支持default-int
-error C2556:'int * BSTree :: findNode(const BSTree :: Node *,const Object &)':重載函數只與返回類型'BSTree :: Node * BSTree :: findNode(const BSTree :: Node *,const Object &)'

編譯器錯誤都指向cpp中代碼的第一行。我嘗試查找錯誤代碼,但我沒有找到任何回答我的問題的原因。

什麼是導致錯誤,爲什麼我的編譯器在'int BSTree'而不是Node * BSTree?我是否犯了語法錯誤或忘記了包含?目前我只包含了iostream和fstream。

提前感謝任何花時間閱讀本文的人。

編輯:

回答科林的問題。

我的#include 「BSTree.h」 在我的.cpp

而在.H我:

#ifndef BSTREE_H 
#define BSTREE_H 

#include <iostream> 
#include <fstream> 
+1

包括你的iostream和fstream的,但你包含.h文件? – Colin 2010-10-17 00:17:42

+1

此外,它聽起來像編譯器無法找到節點的定義 - 請確保將.h文件也包含在.h文件中 – Colin 2010-10-17 00:18:39

+0

請使用「1010101」按鈕進行格式化,而不是將縮進添加到第一個和第最後一行。 – Potatoswatter 2010-10-17 00:19:10

回答

3

從它看起來像你的BSTree內聲明Node錯誤判斷結構。我認爲你的問題在於你的回報類型。嘗試聲明返回類型爲BSTree::Node*

+0

...也就是說,'BSTree :: Node * BSTree :: findNode(const Node * current' – Potatoswatter 2010-10-17 00:21:30

+0

啊,那個修復它,謝謝你,並感謝你對Potatoswatter的澄清 – Moniker 2010-10-17 00:25:20

2

您已經爲您提出的問題得到了答案。我會添加一些關於如何編寫代碼的信息。我喜歡這樣的事情:

Node* BSTree::findNode(const Node* current, const Object &target){ 
    if (current == NULL) 
     return NULL; 

    if (target < current->item) 
     return findNode(current->left, target); 
    if (current->item < target) 
     return findNode(current->right, target); 
    return current; 
} 

這(可能)繼續遞歸,直到current == NULL,而不是試圖在current->left == NULL,或current->right == NULL,這取決於選擇的方向停止。雖然這可以節省一個遞歸級別,但它需要將幾乎所有的遞歸邏輯都複製到左側和右側分支來執行。除非您確定遞歸非常昂貴,否則檢查當前節點是否爲空,可以通過合併這兩個來簡化代碼。該版本的代碼還具有(像大多數C++容器一樣)的優點,它僅需要Object來定義operator<而不是operator==

如果你想更進一步,你可以把指針向左和右分支在一個數組,並簡化代碼甚至更多:

// presumes BSTree::Node is defined something like this: 
class BSTree { 
    class Node { 
     // subnodes[0] == left subtree 
     // subnodes[1] == right subtree 
     Node subnodes[2]; 
    }; 
}; 

BSTree::Node* BSTree::findNode(const Node* current, const Object &target){ 
    if (current == NULL) 
     return NULL; 

    if (current->item == target) 
     return current; 

    return findNode(subnodes[target < current->item]); 
}