2013-07-14 2 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», вы должны передать его «значение» функции вставки. В этом случае, если вы создаете новый узел и назначаете его «root» (как вы здесь делаете), это изменение не будет отображаться вне функции вставки, что приведет к ошибочному поведению. –

ответ

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

Спасибо, и теперь я понимаю, почему в структуре узла есть * 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); 
    // ... 
} 
Смежные вопросы