2016-07-14 286 views
0

,所以我C編碼的二叉搜索樹看起來與這個結構:二叉搜索樹

struct tnode 
{ 
int content; 
struct tnode *left; /* left tree part */ 
struct tnode *right; /* right tree part */ 
}; 

我的主要方法:

int main() 

struct tnode *Baum = NULL; 
struct tnode *tmpPos = NULL; 
Baum = addelement (Baum, 32); 
Baum = addelement(Baum, 50); 
Baum = addelement(Baum, 60); 
tmpPos = searchnode(Baum,50); 

所以basicly這造成我3二叉搜索樹元素(32,50,60)。我的searchnode方法應該將指針移動到「50」,這樣我可以在之後刪除它。然而,如果搜索的元素是我的二叉搜索樹的根,我的searchnode方法只返回指針。

searchnode:

struct tnode *searchnode(struct tnode *p, int nodtodelete) 
{ 
if (p == NULL) 
{ 
    printf("Baum ist leer oder Element nicht vorhanden \n"); 
} 
if (p -> content == nodtodelete) 
{ 
    return p; 
} 
if (p->content > nodtodelete) 
{ 
    searchnode (p->right, p->content); 
} 
if (p->content < nodtodelete) 
{ 
    searchnode(p->left, p->content); 
} 
} 

也許你們能幫助我。

+2

難道你沒有將左/右子樹的決定顛倒過來嗎? 'if(p-> content> nodtodelete)'你應該走左路。 –

+0

歡迎來到本站!查看[tour](https://stackoverflow.com/tour)以獲得更多關於提問的問題,以吸引高質量的答案。你是否已經確認'addelement()'正常工作? – cxw

+0

'searchnode'不會在4個if中的3箇中返回任何結果。 – halex

回答

2

你的函數未定義的行爲,因爲它沒有在遞歸調用任何return語句。

此外,遞歸調用需要固定以使用正確的輸入。

struct tnode *searchnode(struct tnode *p, int nodtodelete) 
{ 
    if (p == NULL) 
    { 
     printf("Baum ist leer oder Element nicht vorhanden \n"); 
     return NULL; 
    } 

    if (p -> content == nodtodelete) 
    { 
     return p; 
    } 

    // This is copied from OP's question but it seems suspect. 
    // It should probably be: 
    // if (p->content < nodtodelete) 
    if (p->content > nodtodelete) 
    { 
     return searchnode (p->right, nodtodelete); 
    } 

    return searchnode(p->left, nodtodelete); 
} 
+0

非常感謝。我很遺憾忘記返回關鍵字... –

+0

現在正常工作。 –

+0

發佈了與二叉搜索樹有關的另一個問題,或許你可以在這裏發現錯誤。 –

2

你應該通過你正在尋找,而不是節點的值值:

searchnode (p->right, nodtodelete); 
        ^

讓其他遞歸調用相同的變化。

searchnode(p->left, nodtodelete); 
+0

編輯兩個,仍然沒有工作,但多數民衆贊成在肯定的一點 –