-1

次のコードは、入力配列を読み取り、そこから BST を構築します。現在の arr[i] がツリー内のノードの複製である場合、arr[i] は破棄されます。構造体ノードの count は、数値が配列に現れる回数を参照します。fi は、配列で見つかった要素の最初のインデックスを参照します。挿入後、ツリーのポストオーダートラバーサルを実行し、データ、カウント、インデックスを (この順序で) 出力しています。このコードを実行したときに得られる出力は次のとおりです。

0 0 7
0 0 6

ご協力ありがとうございました。

ジーヴ

 struct node{

    int data;
    struct node *left;
    struct node *right;
    int fi;
    int count;

};

struct node* binSearchTree(int arr[], int size);
int setdata(struct node**node, int data, int index);
void insert(int data, struct node **root, int index);
void sortOnCount(struct node* root);

void main(){

    int arr[] = {2,5,2,8,5,6,8,8};
    int size = sizeof(arr)/sizeof(arr[0]);
struct node* temp = binSearchTree(arr, size);
sortOnCount(temp);

}   

struct node* binSearchTree(int arr[], int size){

    struct node* root = (struct node*)malloc(sizeof(struct node));

    if(!setdata(&root, arr[0], 0))
        fprintf(stderr, "root couldn't be initialized");

    int i = 1;
    for(;i<size;i++){
        insert(arr[i], &root, i);
    }

    return root;
}    

int  setdata(struct node** nod, int data, int index){

    if(*nod!=NULL){

    (*nod)->fi = index;
    (*nod)->left = NULL;
    (*nod)->right = NULL;
    return 1;
}
return 0;
}

void insert(int data, struct node **root, int index){

struct node* new = (struct node*)malloc(sizeof(struct node));
setdata(&new, data, index);
struct node** temp = root;

while(1){

    if(data<=(*temp)->data){
        if((*temp)->left!=NULL)
            *temp=(*temp)->left;
        else{
            (*temp)->left = new;
            break;
        }
    }
    else if(data>(*temp)->data){
        if((*temp)->right!=NULL)
            *temp=(*temp)->right;
        else{
            (*temp)->right = new;
            break;
        }
    }
    else{
        (*temp)->count++;
        free(new);
        break;
    }
}



}

void sortOnCount(struct node* root){

if(root!=NULL){

    sortOnCount(root->left);
    sortOnCount(root->right);
    printf("%d %d %d\n", (root)->data, (root)->count, (root)->fi);
}   
}
4

2 に答える 2

0

まず、挿入関数でポインターにポインターを渡します。

void insert(int data, struct node **root, int index);

そして、一時変数があります:

struct node** temp = root;

ツリーをトラバースするために使用します。これを行うと、ルートが変更されます。ポインタを渡すだけです。つまり、

void insert(int data, node *root , int index){

第二に、 if(data<=(*temp)->data){<= ではなく < であるべきです。

ヒント: 一般に、実際にポインタをポインタに渡す必要がある場合はかなりまれです。

于 2012-09-15T03:35:01.300 に答える
0

挿入関数のwhileループにif条件を入れます。

while(1)
{
    if(data==(*temp)->data)
          break;
    else
    {
         your stuff;
    }
}

それはあなたの答えかもしれません。

于 2012-09-15T03:01:52.573 に答える