BST uygulaması

oy
1

Bir aşağıdaki uygulanması nesi var ikili arama ağacı (BST) ? Bunun için bir işaretçi işaretçi kullanmak daha iyidir söylendi structinsert fonksiyonunda bağımsız değişken olarak düğüm.

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

insert(int key, struct node *leaf)
{
    if( leaf == 0 )
    {
        leaf = (struct node*) malloc( sizeof( struct node ) );
        leaf->key_value = key;
        /* initialize the children to null */
        leaf->left = 0;    
        leaf->right = 0;  
    }
    else if(key < leaf->key_value)
    {
        insert( key, leaf->left );
    }
    else if(key > leaf->key_value)
    {
        insert( key, leaf->right );
    }
}
Oluştur 13/01/2010 saat 11:01
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
1

Bir düğüm (yaprak == 0) takıldığında, onun üst değişmedi, bu nedenle yeni düğüm yetim haline gelecektir.

Başka bir deyişle, ağaç hala olursa olsun eki ile çağrıldı kaç düğümleri, yalnızca bir düğüm gibi görünecektir.

Cevap 13/01/2010 saat 12:32
kaynak kullanıcı

oy
2

Bu hat:

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

için yeni bir değer verir leafbazı yeni ayrılan belleğin doğrultarak. Ancak, yeni bir değer fonksiyonunu bırakmaz. Işlev döndüğünde, arayan hala eski atıfta olacak leafve bir bellek sızıntısı olacaktır.

Bunu sabitleme için sürebilir iki yaklaşım vardır:

1. Bir pointer, örneğin bir gösterici kullanın

void insert(int key, struct node **leaf)
{
    if(*leaf == 0 )
    {
        *leaf = (struct node*) malloc( sizeof( struct node ) );
        ...
}

/* In caller -- & is prepended to current_leaf. */
insert(37, &current_leaf);

2. (hiçbir değişiklik olursa veya eski yaprak) Yeni bir sayfa geri dönün.

struct node *insert(int key, struct node *leaf)
{
    if(leaf == 0 )
    {
        leaf = (struct node*) malloc( sizeof( struct node ) );
        ...
    }

    return leaf;
}

/* In caller -- & is prepended to current_leaf. */
current_leaf = insert(37, current_leaf);

Işaretçiler işaretçileri anlamak zor olmanın eşiğine yakındır. Eğer ben muhtemelen, ikinci seçenek için giderdim insertşu anda başka bir şey döndürmüyordur.

Cevap 13/01/2010 saat 12:48
kaynak kullanıcı

oy
-2
  #include<stdio.h>
     typedef struct tnode{
       int data;
       struct tnode *left,*right;
     }TNODE;
     TNODE * createTNode(int key){
       TNODE *nnode;
       nnode=(TNODE *)malloc(sizeof(TNODE));    
       nnode->data=key;
       nnode->left=NULL;
       nnode->right=NULL;
      return nnode;
}

    TNODE * insertBST(TNODE *root,int key){
     TNODE *nnode,*parent,*temp;
     temp=root;
      while(temp){
        parent=temp;
        if(temp->data > key)
            temp=temp->left;
        else
            temp=temp->right;    
    }    
     nnode=createTNode(key);
    if(root==NULL)
        root=nnode;
    else if(parent->data>key)
        parent->left=nnode;
    else
        parent->right=nnode;
    return root;
}

     void preorder(TNODE *root){
       if(root){
         printf("%5d",root->data);    
         preorder(root->left);
         preorder(root->right);
       }    
     }  

    void inorder(TNODE *root){
       if(root){
        inorder(root->left);
        printf("%5d",root->data);    
        inorder(root->right);
      }    
    }

    void postorder(TNODE *root){
       if(root){
        postorder(root->left);    
        postorder(root->right);
        printf("%5d",root->data);
      }    
    }

     main(){
       TNODE *root=NULL;
       int ch,key;
       do{
         printf("\n\n1-Insert\t2-Preorder\n3-Inorder\t4-Postorder\n5-Exit\n");
         printf("Enter Your Choice: ");
         scanf("%d",&ch);  

        switch(ch){ 
            case 1:
                printf("Enter Element: ");
                scanf("%d",&key);
                root=insertBST(root,key);
                break;
            case 2:
                preorder(root);
                break;
            case 3:
                inorder(root);
                break;
            case 4:
                postorder(root);
                break;
            default:
                printf("\nWrong Choice!!");
        }

    }while(ch!=5);
    getch();
    return 0;
}
Cevap 04/10/2013 saat 14:31
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more