2012-11-28 208 views
1

所以我想以一個值插入使用該遞歸函數二叉樹:遞歸二叉樹插入

void add(node* *hd, int v){ 
node* curr = *hd; 
if(curr == NULL){ 
    curr = (node*)malloc(sizeof(node)); 
    curr->value = v; 
}else{ 
    if(v < curr->value){ 
     add(&curr->left, v); 
    }else{ 
     add(&curr->right, v); 
    } 
} 
} 

它似乎並不奏效,我只是不明白爲什麼我不能做這樣的事情。我將如何去修復它?

+0

這要花一天時間修復,讓你瘋狂愚蠢的錯誤的一個例子。 – UmNyobe

+0

哪裏設置curr-> left和curr-> right的值? –

回答

5

您需要初始化指針,因爲它們可能會設置爲分配空間時獲得的值。現在當你通過add(&curr->left, v);curr->left可能不是一個指針,但它仍然不是NULL;

void add(node* *hd, int v){ 
    node* curr = *hd; 
    if(curr == NULL){ 
     curr = malloc(sizeof(node)); 
     curr->left = curr->right = NULL; 
     curr->value = v; 
     *hd = curr; // from Mohamed KALLEL 
    }else{ 
     if(v < curr->value){ 
      add(&curr->left, v); 
     }else{ 
      add(&curr->right, v); 
     } 
    } 
} 
+0

沒錯。你的回答錯過了將新節點'curr'連接到樹 – MOHAMED

+0

+1以將'right'和'left'初始化爲'NULL'的事實 – MOHAMED

+0

啊,是的,忽略了這一點。 thx –

2
if(curr == NULL){ 
    curr = malloc(sizeof(node)); 
    curr->right = NULL; 
    curr->left = NULL; // From ks6g10 in order to initialize right and left to NULL 
    curr->value = v; 
    *hd = curr; // add this 
} 

BTW使用calloc,而不是malloc。它將您的節點內存初始化爲0

+0

使用'calloc()'沒有任何意義;它的唯一工作內容(整數)立即被覆蓋。請注意,不能依賴'calloc()'正確設置指向NULL的指針。 – unwind

+0

是的,你是對的。在某些平臺中,NULL不是0. thx。回答更新 – MOHAMED

1

另一種方法是在二叉樹的遞歸可以這樣做補充:

node *add(node *hd, int v) 
{ 
node* curr = NULL; 

if(!hd) 
{ 
    curr = malloc(sizeof(node)); 
    curr->value = v; 
    curr->left = NULL; 
    curr->right = NULL; 
    return curr; 
}else { 
    if(v < curr->value) 
     curr->left = add(curr->left,v); 
    else curr->right = add(curr->right,v); 
    } 

    return hd; 
    } 
0

需要初始化你的新形成的節點的左側和右側指針與NULL,讓您的高清點該節點。

void add(node* *hd, int v){ 
node* curr = *hd; 
if(curr == NULL){ 
    curr = malloc(sizeof(node)); 
    curr->value = v; 
    curr->left=curr->right=NULL; 
    *hd = curr; 

}else{ 
    if(v < curr->value){ 
     add(&curr->left, v); 
    }else{ 
     add(&curr->right, v); 
    } 
} 
} 
0

我做了這樣的:

void insert(int data, node *&cur) 
{ 
    if (cur == NULL) 
    { 
     cur = (struct node*) malloc(sizeof(struct node)); 
     cur->data = data; 
     cur->left = NULL; 
     cur->right = NULL;    
    } 
    else 
    { 
     if (data > cur->data) 
     { 
      insert(data, cur->right); 
     } 
     else 
     { 
      insert(data, cur->left); 
     } 
    } 
}