Konuyu görüntüle
IUCODERS FORUM > Programlama > C / C++ > ağacın yaprak sayısını bulmak
Yazar
naranja


avatar
Kraliyet Ailesinden
Kayıt: 18.10.2007
14.11.2008-15:46 #52494
Elimizde derinliği, eleman sayısı vs bilinmeyen bir ağaç var ve biz bunun yaprak sayısını bulmak istiyoruz, her düğümün left ve right diye iki çocuğu olduğunu düşünürsek, left==NULL ve right==NULL olduğu zaman bu bir yapraktır deyip sayacı artırıyorum, ancak ağacın derinliğini bilmediğim için döngü hiç sonlanmıyor, yaprakları saydıktan sonra döngü hangi şartlarda bitmeli?

ben önce ağacın düğümlerini başka bir fonksiyonda sayıp bir değişkene aktarıyorum, sonra bu değişkeni yaprak sayısını bulan fonksiyona yolluyorum, fonksiyon yaprakları sayarken aynı zamanda düğümleri de sayıyor, eğer bulduğu düğüm sayısı daha önce bulduğum düğüm sayısına eşitse yaprak sayısını döndürüyor, bunu yapmanın daha kolay veya başka bir yolu var mı?





Kaybolur hayatIn tarifsiz ahengi;
Zaman bir tablodur düser duvarlardan.






Yazar
iemre


avatar
Anadolu
Kayıt: 26.05.2007
14.11.2008-16:06 #52495
DLR , LDR, LRD şeklinde ağacı dolaştığın fonksiyon ile ağaçta dolaşırken bir değişken tut ve her dolaşılan yaprak için bir arttır.böylece fonksiyon bitiminde bütün ağacı dolaşmış dolayısıyla yaprak sayısınıda bulmuş olursun.





More than one
Yazar
marakana


avatar

Kayıt: 08.03.2007
14.11.2008-17:05 #52497
#include <stdio.h>
#include <stdlib.h>

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

typedef struct node *NODEPTR;
int yapraksayisi=0;


void yaprakdugumler(NODEPTR treeptr)
{	
	if(treeptr!=NULL){

		if(treeptr->left==NULL && treeptr->right==NULL)
			yapraksayisi++;

		yaprakdugumler(treeptr->left);
		yaprakdugumler(treeptr->right);
	}
}








Yazar
naranja


avatar
Kraliyet Ailesinden
Kayıt: 18.10.2007
14.11.2008-17:24 #52498
bu söyledikleriniz doğru, ama struct * tipinde bir verinin bool ile kıyaslanması biraz mantıksız geliyor bana.





Kaybolur hayatIn tarifsiz ahengi;
Zaman bir tablodur düser duvarlardan.






Yazar
unforgiven


avatar

Kayıt: 12.06.2008
14.11.2008-17:46 #52499
naranja yazdi
 
bu söyledikleriniz doğru, ama struct * tipinde bir verinin bool ile kıyaslanması biraz mantıksız geliyor bana.

struct * tipinde bir verinin bool ile kıyaslanması nerde geçiyor?





Yazar
naranja


avatar
Kraliyet Ailesinden
Kayıt: 18.10.2007
14.11.2008-17:55 #52501
mesela bu yukardaki kod için, treeptr nin NULL olmadığı durumlar gibi.





Kaybolur hayatIn tarifsiz ahengi;
Zaman bir tablodur düser duvarlardan.






Yazar
unforgiven


avatar

Kayıt: 12.06.2008
14.11.2008-18:13 #52502
naranja yazdi
 
mesela bu yukardaki kod için, treeptr nin NULL olmadığı durumlar gibi.

o kıyaslama bool değil ve zaten bir pointer'ın boş olup olmadığı NULL ile kontrol edilir.

NULL ifadesi stdlib.h kütüphasinde şu şekillerde tanımlı:
#define NULL  0
// ya da
#define NULL  0L
// ya da
#define NULL  (void *) 0


şu linkte bu konuda faydalı bilgiler bulabilirsiniz:
http://en.wikipedia.org/wiki/Pointer#The_null_pointer





Yazar
serdr


avatar
Istanbul
Kayıt: 13.07.2006
14.11.2008-20:15 #52505
Return değeri ile doğrudan çözüm de şık bir çözüm olur.

int say(nodeptr * T){
if(T==null) return 0;
if (T->L==null && T->R==null) return 1;
return say(T->R)+say(T->L);
}









Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb