חיפוש מיקום מס' בעץ

yhaim

New member
חיפוש מיקום מס' בעץ

יש לי בעיה מוזרה. אני צריך לסדר מספרים בעץ בינארי עד אשר הוזן מס' שלילי. ולחפש האם מס' שהמשתמש הזין נמצא בעץ ואם כן באיזה מיקום. כאשר אני מכניס מספרים בסדר מסוים(רק עולה או רק יורד) הכל בסדר. אבל כאשר אני מכניס מספרים לא בסדר מסוים התוכנית לא עובדת. למשל 2,4,8,1,3 במצב כזה התוכנית מחזירה אינדקס לא נכון. במצב כזה 1,2,5,8,10,12,14 התוכנית מחזירה אינדקס נכון. אני לא יודע אם הבעיה בהכנסת המספרים לעץ או בפונקציית החיפוש.
printf("enter nums to build the tree\n"); int num,i=0; do { scanf("%d",&num); if(num>=0) { temp=(Tr*)malloc(sizeof(Tr)); temp->v=num; temp->right=NULL; temp->left=NULL; if(i==0) root= rec_ins(root,temp); else rec_ins(root,temp); i++; } } while(num>=0); printf("enter num to search in the tree\n"); scanf("%d",&num); int ind=rec_find(root,num); if(ind > -1) printf("The num found in the tree at ind %d",ind); else printf("The num not found in the tree"); getchar(); getchar(); } Tr * rec_ins(Tr*t,Tr*temp) { if(t==NULL) return temp; if(temp->v > t->v) t->right=rec_ins(t->right,temp); else t->left=rec_ins(t->left,temp); return t; } int rec_find(Tr*t,int num) { int count; if(t==NULL) return -1; if(num > t->v) { count=rec_find(t->right,num); if(count>-1) return count+1; else return count; } else if(num < t->v) { count=rec_find(t->left,num); if(count>-1) return count+1; else return count; } else return 1; }​
 

vbgames

New member
מה הכוונה אינדקס?

נניח שהכנסת את הרצף(משמאל לימין): 8,9,10,7 ואתה מחפש את 7. לפי הפונקציה שלך האינדקס הוא 2, כלומר הרמה של הצומת בעץ ועוד אחד. כנראה שלא לזה התכוונת. אם התכוונת למצוא את מה האינדקס של המספר לפי הגודל שלו, כלומר האינדקס של 7 הוא 1 בגלל שהוא הכי קטן בעץ אז אתה צריך לסרוק את העץ בסדר תוכי, ולספור כל צומת שאתה מבקר בה עד אשר הגעת למספר שחיפשת.(אם אתה צריך עזרה עם זה אז תגיב). יש עוד אפשרות שלא קשורה לעץ בינארי. אולי רצית לקבל את האינדקס של 7 מבחינת סדר הכנסת המספרים לעץ, כלומר 4. אני לא חושב שזה ניתן לביצוע אלא אם כן תשמור את האינדקס הזה(אצלך בתוכנית זה i) יחד עם המספר עצמו. אני מתכוון לשנות את מבנה נתונים Tr ולהוסיף פרט לv גם את index.
 
למעלה