2013-07-14 35 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); 
    // ... 
}