2017-04-23 127 views
-1

我實現我自己的二叉樹的打印,這是我的節點結構:二叉樹不起作用

struct node 
{ 
    int value; 
    struct node *left; 
    struct node *right; 
}; 

和我的開始節點:

struct node * start = NULL; 

這是我的插入功能:

void insert(int value, struct node *leaf) 
{ 
    if(leaf == NULL) 
    { 
     leaf = (struct node*) malloc(sizeof(struct node)); 
     leaf->value = value; 
     leaf->left = NULL;  
     leaf->right = NULL; 
    } 
    else if(value < leaf->value) 
    { 
     insert(value, leaf->left); 
    } 
    else if(value > leaf->value) 
    { 
     insert(value, leaf->right); 
    } 
} 

,這是我使用的訪問樹中的功能:

void print_tree(struct node * leaf){ 
    if(leaf == NULL) 
    return; 
    print_tree(leaf->left); 
    printf(" %d ",leaf->value); 
    print_tree(leaf->right); 
} 

問題是,插入所有值後,它不打印任何東西。

+0

你在這裏缺少一個逗號:'插入(價值葉子 - >左);' –

+0

你可能想搜索並閱讀*由C基準模擬通*。 –

+0

@BenSteffan這只是一個類型錯誤,無論如何。 –

回答

1

我假設你正在調用以這種方式插入:

insert(5, start); 

的問題是,這種方式要複製NULL到插入功能的leaf局部變量。

因此,如果您正在爲節點分配內存,則不會更新開始指針。

爲了做到這一點,您需要在insert函數(struct node ** leaf)中使用雙指針。

這應該工作:

void insert(int value, struct node **leaf) 
{ 
    if((*leaf) == NULL) 
    { 
     (*leaf) = malloc(sizeof(struct node)); // You don't need casting 
     (*leaf)->value = value; 
     (*leaf)->left = NULL;  
     (*leaf)->right = NULL; 
    } 
    else if(value < (*leaf)->value) 
    { 
     insert(value, &(*leaf)->left); 
    } 
    else if(value > (*leaf)->value) 
    { 
     insert(value, &(*leaf)->right); 
    } 
} 
+0

感謝它的工作原理 –