folder Tahribat.com Forumları
linefolder C - C++
linefolder Binary Treeler Hakkinda



Binary Treeler Hakkinda

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ataturkcu1
    ataturkcu1's avatar
    Kayıt Tarihi: 20/Nisan/2007
    Erkek

    Hocalar merhaba,

    Binary treeler hakkinda duzgun bir kaynak verebilir misiniz?Googledan arastirdim genellikle OOP mantigiyla anlatilmis,bana struct haliyle lazim.Nasil yeni bir node eklenir,nasil bir node bulunur vs bunlar gerekiyor.


    Pragmatism&Realism
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    Binary search tree örneği istiyorsun anladığım kadarıyla. En doğal uygulaması özyinelemeli fonksiyonlar ile, ancak döngüsel de yazılabilir aynı kolaylıkta. 

    Biraz incelersen anlayacağını düşünüyorum. Yoketme fonksiyonunu yazmadım sadece ekleyen ve bulan fonksiyonları yazdım, ayrıca sadece bu değil tüm veri yapıları için handle yöntemi uygulamak daha kullanışlıdır bu şekilde tek pointer üzerinde işlem yapmaktan ancak en kısa kod en kolay anlaşılan koddur diyerek böyle yazdım kolay gelsin.

    Biraz açıklama,

    Öncelikle binary search treede eleman eklenirken kullanılan tek kural küçük olan eleman sola, büyük olan eleman sağa eklenir, mesela mevcut node 75 ise, 77 sağa, 65 sola eklenir. her node ayrıca sağ ve sol nodu gösteren bir pointer a sahiptir, mesela bir node un sağ pointer ı NULL ise, orada eleman yok demektir, eleman olmayan yöndeki pointer NULL olur kısacası.

    Treenin herhangi bir parçasını alırsan o da bir treedir, yani her hangi bir node u root kabul edersen, alt tree yi elde edersin. bu yüzden ekleme ve arama işlemleri hep özyineleme ile yapılır, sonraki fonksiyona alt tree yollanır, alan fonksiyon tabiki bunu root olarak bilir ve işlem yapar.

     

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct node {
    	int value;
    	char *name;
    	struct node *left;
    	struct node *right;
    } Node;
    
    Node* insert(Node *treep, Node *newp)
    {
    	if (treep == NULL) {
    		return newp;
    	}
    	
    	if (newp->value > treep->value) {
    		treep->right = insert(treep->right, newp);
    	} 
    	else if (newp->value < treep->value){
    		treep->left = insert(treep->left, newp);
    	} 
    	else {
    		printf("Duplicate entry ignored: %d\n", newp->value);
    	}
    	return treep;
    }
    
    Node* lookup(Node *treep, int value)
    {
    	if (treep == NULL) {
    		return NULL;
    	}
    	
    	if (value == treep->value) {
    		return treep;
    	} 
    	else if (value > treep->value) {
    		return lookup(treep->right, value);
    	} 
    	else {
    		return lookup(treep->left, value);
    	}
    }
    
    Node* newnode(int value, char *name)
    {
    	Node *newp = calloc(1, sizeof(Node));
    	if (newp == NULL) {
    		fprintf(stderr, "Out of memory");
    		exit(1);
    	}
    	
    	newp->value = value;
    	newp->name = name;
    	return newp;
    }
    
    int main()
    {
    	Node *tree = NULL;
    	Node *testNode = NULL;
    	
    	tree = insert(tree, newnode(77, "root"));
    	insert(tree, newnode(55, "dogan"));
    	insert(tree, newnode(66, "ozgur"));
    	insert(tree, newnode(88, "cancan"));
    	insert(tree, newnode(99, "ahmet"));
    	
    	testNode = lookup(tree, 55);
    	
    	if (testNode) {
    		printf("Value: %d  Name: %s\n", testNode->value, testNode->name);
    	}
    	getchar();
    	return 0;
    }
    Tugberk tarafından 03/Oca/13 21:29 tarihinde düzenlenmiştir
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    erngnctrk
    erngnctrk's avatar
    Kayıt Tarihi: 10/Eylül/2012
    Erkek

    http://www.erengencturk.com.tr/files/trees.jar

    veri yapılarında iyiişime yaramıştı mantığını anlama konusunda.


    .
Toplam Hit: 1208 Toplam Mesaj: 3