2013-07-14 40 views
0

我想寫一個BST,但插入功能不起作用。調試它,我發現它沒有插入。我不能插入一個節點到bin搜索樹

/* Binary Search Tree (BST).demo */ 
#include <stdio.h> 
#include <stdlib.h> 

typedef struct treeNode{ 
    int data; 
    struct treeNode* lChild; 
    struct treeNode* rChild; 
} treeNode; 

treeNode* createNode(){ 
     treeNode *nNode; 
     nNode=(struct treeNode*)malloc(sizeof(treeNode)); 
     nNode->data=0; 
     nNode->lChild=NULL; 
     nNode->rChild=NULL; 

     return nNode; 
} 

void insert(treeNode* rt,int idata) 
{ 
    if(rt==NULL){ 
    treeNode* nNode; 
    nNode=createNode(); 
    nNode->data=idata; 
    rt=nNode; 
    rt->lChild=NULL; 
    rt->rChild=NULL; 
    }else{ 
    if(idata < rt->data) 
     insert(rt->lChild,idata); 
    else insert(rt->rChild,idata); 

    } 
} 

int main() 
{ 
    treeNode *root; 
    root=(treeNode*)malloc(sizeof(treeNode)); 
    root->data=15; 
    root->lChild=NULL; 
    root->rChild=NULL; 

    insert(root,13); 
    if(root->lChild==NULL) 
      printf("root no l child\n"); 
    // printf("root lchild data :%d",root->lChild->data); 
    return 0; 
} 
+1

使用「根」的參考,當你將它作爲參數傳遞給插入功能。 –

+0

但根本身是一個指針,是否需要引用? –

+0

如果你不使用對'root'的引用,你會通過「value」將它傳遞給插入函數。在這種情況下,如果您正在創建一個新節點並將其分配給「根」(正如您在此處所做的那樣),則此更改不會反映在插入函數之外,從而導致錯誤行爲。 –

回答

2

使用此作爲插入功能:

void insert(treeNode** rt,int idata) 
{ 
    if((*rt)==NULL) 
    { 
     treeNode* nNode; 
     nNode=createNode(); 
     nNode->data=idata; 
     *rt=nNode; 
     (*rt)->lChild=NULL; 
     (*rt)->rChild=NULL; 
    } 
    else 
    { 
     if(idata < (*rt)->data) 
      insert(&((*rt)->lChild),idata); 
     else 
      insert(&((*rt)->rChild),idata); 
    } 
} 

,並在主插入函數調用()爲:

insert(&root,13); 
+0

謝謝,我現在明白爲什麼Node的struct中有* leftchild&* rightchild。謝謝@Nithin Bhaskar –

+0

@michael_stackof沒問題。玩得開心編碼:) –

0

我通常執行這樣的:

void insert(treeNode* rt, int idata) { 
    // assert(rt != NULL); 
    if(idata < rt->data){ 
     if(rt->lChild != NULL) 
      insert(rt->lChild, idata); 
     else { 
      rt->lChild = createNode(); 
      rt->lChild->data = idata; 
     } 
    } else { 
     if(rt->rChild != NULL) 
      insert(rt->rChild, idata); 
     else { 
      rt->rChild = createNode(); 
      rt->rChild->data = idata; 
     } 
    } 
} 

此外,我更喜歡給出一個參數createNode()

treeNode* createNode(int idata){ 
    // ... 
    nNode->data = idata; 
    // ... 
} 

所以insert將看起來像:

void insert(treeNode* rt, int idata) { 
    // ... 
      rt->lChild = createNode(idata); 
    // ... 
      rt->rChild = createNode(idata); 
    // ... 
}