-1

私は C でバイナリ ツリーを実装しようとしています。私は次のコードを使用しています:

struct node* insert(struct node *root,int num);

void preorder(struct node *root);

struct node *root=NULL;

int count=1;

struct node {

    struct node *lchild;
    struct node *rchild; 
int data;
};

int main(){

    root=insert(root,1);
//root=insert(root,2);
preorder(root); 
return;
}

struct node* insert(struct node *root,int num){//insert a node into tree

   //struct node *q;
if(root==NULL)
{
    root=(struct node*)malloc(sizeof(struct node)); 
    root->data=num;
    root->lchild=NULL;
    root->rchild=NULL;
    //root=q;
    count++;
}
else{
    if(count % 2==0){
        root->lchild=insert(root->lchild,num);
    }
    else{
        root->rchild=insert(root->rchild,num);
    }
}
return(root);
}

void preorder(struct node *root){

    while(root!=NULL){
    printf("%d\t",root->data);
    preorder(root->lchild);
    preorder(root->rchild);     
}
}

ここでは、最初に値を 1 つだけ挿入していますが、バグが発生します。したがって、insert() では間違いはありません。preorder() または main() で何か修正を行う必要があります。

4

3 に答える 3

3

preorder()をすべきかわかりませんが、この行は無限ループを引き起こします:

 while(root!=NULL){

私はあなたがそうではifないと書くつもりだったと思いますwhile

于 2013-01-25T08:04:28.393 に答える
2

preorder 関数には while ステートメントではなく if ステートメントが必要です。

while(root!=NULL){ //This is causing the infinite loop

ループ本体では、どの時点でもルート ポインターを変更しないため、ルート要素の条件が真である場合、ループから抜け出すことはありません。

代わりに次のようにする必要があります。

if(root!=NULL){
于 2013-01-25T08:05:31.853 に答える
0

再帰ループが基本条件を持ち、どこかで終了するように書くのifではなく、書く必要があります。while

if(root!=NULL)書く代わりにあなたのコードでwhile(root!=NULL)

于 2013-01-25T10:26:29.720 に答える