2014-06-27 64 views
0

以下是我構建簡單樹的代碼。我在這裏使用的方法是,如果一個特定的節點位於arr []數組中的索引n處,那麼它將在子索引2 * n + 1處留下子項,並且在同一個子索引處將子項留在2 * n + 2處[]數組。然後我正在進行一次遍歷。但是,我在節點D處得到一個無限循環作爲我的輸出。如果有人能夠幫助我在這裏,會很樂意。簡單的樹遍歷給出了一個非終止循環。 (使用數組)

#include <stdio.h> 
#include <malloc.h> 

struct node 
{ 
    struct node * lc; 
    char data; 
    struct node * rc; 
}; 

char arr[] = {'A','B','C','D','E','F','G','\0','\0','H','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'}; 
struct node * root = NULL; 

struct node * buildTree(int rootIndex) 
{ 
    struct node * temp = NULL; 

    if(arr[rootIndex]!='\0') 
    { 
      temp = (struct node *)malloc(sizeof(struct node)); 
      temp->lc = buildTree(rootIndex * 2 + 1); 
      temp->data = arr[rootIndex]; 
      temp->rc = buildTree(rootIndex * 2 + 2); 
    } 

    return temp; 
} 

void inorder(struct node * parent) 
{ 
    while(parent != NULL) 
    { 
     inorder(parent->lc); 
     printf("%c\t",parent->data); 
     inorder(parent->rc); 
    } 
} 

int main() 
{ 
    root = buildTree(0); 
    inorder(root); 
    return 0; 
} 
+0

對於這樣的問題,您應該從調試器請求幫助,而不是本網站 – YePhIcK

+1

1)'while(parent!= NULL)' - >'if(parent!= NULL)' – BLUEPIXY

+0

噢,好吧,這很令人尷尬。謝謝你! –

回答

2

像BLUEPIXY在評論中提到的,你需要有if更換whileinorder()方法。在構建樹時,D構成了最左邊的孩子。因此,在按順序遍歷期間,遇到D作爲要打印的第一個節點。但while循環不斷打印它,因爲條件永遠不會變成錯誤。

我確定像gdb這樣的工具在解釋這個方面會做得更好。

+0

謝謝,有問題。我正在使用CodeBlocks。 –

+0

我的意思是gdb而不是gcc。更正以上:)從Wikipedia頁面CodeBlocks調試器看起來也不錯。 – bytefire

相關問題