2017-09-09 16 views
0

私はすでにコードをデバッグしており、間違いはありませんでした。以下のコードは、バイナリ検索ツリー(BST)のすべてのデータを出力しません。ルートノードのみ、最後の2ノードはインオーダートラバーサルで表示されます。バイナリ検索ツリーの出力が正しくありません

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

node* newNode(int data){ 
    node *ptr=new node; 
    ptr->key=data; 
    ptr->left=ptr->right=NULL; 

    return ptr; 
} 

node* insert_node(node* root,int data){ 
    if(root==NULL){ 
     root=newNode(data); 
    }else if(data<=root->key){ 
     root->left=newNode(data); 
    }else{ 
     root->right=newNode(data); 
    } 

    return root; 
} 

void inorder(node* root){ 
    if(root==NULL) 
     return; 
    inorder(root->left); 
    cout<<root->key<<" "; 
    inorder(root->right); 
} 

int main(){ 
    node *root=NULL; 

    root=insert_node(root,10); 
    root=insert_node(root,12); 
    root=insert_node(root,15); 
    root=insert_node(root,1); 
    root=insert_node(root,20); 

    inorder(root); 

    return 0; 
} 
+0

まず、 'data = 10'(これは' root'の役割を果たす)のノードを挿入します。次に、 'data = 8'というノードを挿入します。そのため、左に挿入します。さて、あなたは 'data = 6'でノードを挿入します。あなたのルートノードは同じであるので、誤っていなければ 'data = 6'のノードは' data = 8'のノードを上書きします。さらに、これは 'data = 8'のノードが削除されずにアクセスできないためにメモリリークを引き起こします – Fureeish

+1

*私はすでにコードをデバッグして間違いを見つけませんでした* - 間違いが見つからなかった場合、あなたは問題がありますか?何かが正しく動作しないことが分かっているなら、間違いがあります。 – PaulMcKenzie

+0

@Fureeishデータは、再帰によってリーフでのみ追加されます。 'data = 8'が挿入されている場合はルートの左に挿入されますが、' data = 6'が挿入されると 'data = 8'ノードの左に挿入されます。 – ankuselfie

答えて

0

insert関数にリーフノードを見つける反復的または反復的な実装がありません。新しいノードがルートノードの子ノードを置き換えます。そして、私はそれがコメントセクションで非常によく強調されていると思います。

ここでは、リーフノードが反復を使用して見つかった後、新しいノードが挿入されるコードブロックがあります。

node *insert_node(node *root, int data){ 
struct node *ptr, *nodeptr, *parentptr; 
ptr = (struct node*)malloc(sizeof(struct node)); 
ptr->data = data; 
ptr->left = NULL; 
ptr->right = NULL; 
if(root==NULL) //tree is empty 
{ 
    root=ptr; 
    root->left=NULL; 
    root->right=NULL; 
} 
else 
{ 
    parentptr=NULL; // keep the address of parent node 
    nodeptr=root; 
    while(nodeptr!=NULL) 
    { 
     parentptr=nodeptr; 
     if(data<nodeptr->data) 
      nodeptr=nodeptr->left; 
     else 
      nodeptr = nodeptr->right; 
    } 
    // now the parentptr contains address of the leaf node 
    if(data<parentptr->data) 
     parentptr->left = ptr; 
    else 
     parentptr->right = ptr; 
} 
return root; 
} 

他のソースを参照して、同じものを再帰的に実装することもできます。

関連する問題