פורסם 2006 בדצמבר 3118 שנים מחלקה לייצוג עץ אדום שחור.בפונקציה לסיבוב ימני ושמאלי, מה צריך לעושת כדי שהשינויים לא ישארו רק בפונקציה אלא ישפיעו על כל העץ???
פורסם 2006 בדצמבר 3118 שנים אני יודע רק בקשר לשיח ירוק וכחול.. אבל אולי זה דומה :-\כדי שנוכל להבין ולעזור לך את צריכה לנסח את זה בצורה נורמלית..
פורסם 2006 בדצמבר 3118 שנים מחבר עץ אדום שחור הוא סוג של מבנה נתונים (עץ חיפוש בינארי)יש לי פונקציה בה אני משנה סדר של איברים הקשורים זה בזה, על-מנת לא לאבד קשר עם אף איבר אני מצהירה על משתני עזר <נמחקים ביציאה מהפונקציה>איך אני גורמת לשמירת השינויים שערכתי?זה הקוד שכתבתי :template <class T>void BRtree<T>::Left(Node<T>*current){ Node<T>* p = current->parent; p->right=current->left; if(current->parent!=NULL) { current->parent=current->parent->parent; } else { current->parent=NULL; root=current; } current->left=p; current->left->right=p->right;}
פורסם 2006 בדצמבר 3118 שנים תנסי לשלוח מצביע למצביע.Node<T>**currentכל פעם תיגשי ל- (*current)->somethingבמקום ל-current->something
פורסם 2006 בדצמבר 3118 שנים אין לך שום בעיה (שקשורה להעברת פרמטרים) בפונקציה.הדבר היחיד שלא נשמר זה הערך של current (כלומר - הכתובת שנמצאת במצביע current), ואת זה את במילא לא עושה בפונקציה.
פורסם 2006 בדצמבר 3118 שנים כדאי לבדוק אם current->parent!=null לפני שאת עושהcurrent->parent->right=current->left
פורסם 2006 בדצמבר 3118 שנים מחבר תנסי לשלוח מצביע למצביע.Node<T>**currentאיך אני מצהירה על הפונקציה???למה הופך: void Right(Node<T>*current);
פורסם 2007 בינואר 118 שנים אם את שומרת את שורש העץ במחלקה שלך(לא שמתי לב מקודם שזו מחלקה), את לא צריכה להפוך את הפרמטר למצביע למצביע(טעות קטנה שלי).אם זו לא הייתה מחלקה ששומרת את השורש היית צריכה לשלוח פוינטר לפוינטר(בשביל המקרה שהצומת שאת מסובבת הוא השורש עצמו) זה לא המצב.ראשית, אני ממליץ לך לבדוק את השורות האלה: p->right=current->left; if(current->parent!=NULL)ולראות אם הן בכלל בסדר הנכון.שנית, תבדקי אם מה שאת עושה בפונ הוא נכון.לילה טוב אני עייף אין לי כוח לחשוב עכשיו... SRY.
פורסם 2007 בינואר 118 שנים מחבר בלבלת אותי לגמרי!!!! כרגע לא משנה לי אם הפונקציה פועלת נכון.השאלה שלי: יש לי פונקציה להכנסת איבר לעץ אדום שחור, אחרי שהכנסתי לפי כללי עץ חיפוש בינארי, אני צריכה לערוך תיקון בעץ .יש קריאה לפונקציה גלגול לימין על קודקוד בעץ ןלכן הפונקציה תקבל מצביע לקודקוד, איך השינוי שנעשה בפונקציה אכן פועל ומשתנה בעץ עצמו????
פורסם 2007 בינואר 218 שנים מחבר הלוואי ותעזרו לי:רשמתי בתכנית הראשית לולאה להכנסת איברים לעץ: BRtree<int> br; for(int i=0; i<10; i++) { br.Add(i+1); }הבעיה: פונקצית ההוספה משתמשת במצביע מקומי,ואכן, בשתי הפעמים הראשונות של הלולאה הפונקציה עובדת כראוי, בפעם השלישית (פשוט כי לא הצלחתי להריץ עוד) אין שום התייחסות למצביע current ולכן הפונקציה נתקעת וצריך לעשות break.מה קןרה פה??? למה הוא לא מכיר את המצביע???????ככה נראית הפונקציית הוספה:template <class T>void BRtree<T>::Add(T val){ Node<T>* current= Insert(val); Node<T>* ezer; if(current->parent==NULL) { current=root; root->color=1; return; } else { while((current!=root)&&(current->parent->color==0)) { if(current->parent==current->parent->parent->left) { ezer=current->parent->parent->right; if(ezer->color==0) { current->parent->color=1; ezer->color=1; current->parent->parent->color=0; current=current->parent->parent; } else { if(current==current->parent->right) { current=current->parent; Left(current); } current->parent->color=1; current->parent->parent->color=0; Left(current->parent->parent); } } } root->color=1; }}
פורסם 2007 בינואר 318 שנים מחבר פונקציה Insert מכניסה איברים לעץ כמו בעץ חיפוש בינארי, ואחר כך פונקציה ADD מתקנת את העץ שיהיה עץ אדום שחור תקני. template <class T> Node<T>* BRtree<T>::Insert(T val){ if (!root) { root=new Node<T>(val,NULL,NULL,NULL,0); return root; } Node<T>*p = root; return Insert(root,val,p);}template <class T> Node<T>* BRtree<T>::Insert(Node<T>*current, T val, Node<T>*p){ if (current->value < val) // Add to right subtree if (!current->right) { current->right=new Node<T>(val,NULL,NULL,current,0); return current->right; } else Insert(current->right,val,current); else // Add to left subtree if (!current->left) { current->left=new Node<T>(val,NULL,NULL,current,0); return current->left; } else Insert(current->left,val,current);} כשאני מסתכלת בפונקציה ADD אחרי הוספת האיבר השלישי הוא אכן מחובר לעץ ROOT מצביע אליו, רק CURRENT שאמור להצביע לאיבר החדש לא מצביע. ????????????????????????????
פורסם 2007 בינואר 318 שנים לא נכנסתי לקוד שלך לעומק, אבל שמתי לב שהגדרת שם Node<T> *p, ואת לא משתמשת בו.בקשר להוספה: if(current->parent==NULL) { current=root;למה את עושה current = root? מובטח לך שהוא יהייה השורש, מכיוון שהאבא שלו הוא NULL(ככה עשית את זה בפונ Insert).ולבסוף: if(current->parent==current->parent->parent->left)מה קורה אם current->parent->parent הוא NULL?(אם current הוא הבן של השורש).
פורסם 2007 בינואר 318 שנים מחבר 1. לא משתמשת במצביע Node<T> *p בטעות.2. נכון, שיניתי, זה הקוד המתוקן:template <class T>void BRtree<T>::Add(T val){ Node<T>* current; Insert(val); current=includes(root,val); Node<T>*ezer; if(current->parent==NULL) { current=root; root->color=1; return; } else { while((current!=root)&&(current->parent->color==0)) { if(current->parent==current->parent->parent->left) { ezer=current->parent->parent->right; if((ezer!=NULL)&&(ezer->color==0)) { current->parent->color=1; ezer->color=1; current->parent->parent->color=0; current=current->parent->parent; } else { if(current==current->parent->right) { current=current->parent; Left(current); } else { current->parent->color=1; current->parent->parent->color=0; Right(current->parent); } } } else { ezer=current->parent->parent->left; if((ezer!=NULL)&&(ezer->color==0)) { current->parent->color=1; ezer->color=1; current->parent->parent->color=0; current=current->parent->parent; } else { if(current==current->parent->left) { current=current->parent; Right(current); } else { current->parent->color=1; current->parent->parent->color=0; Left(current->parent); } } } } root->color=1; }}ואלו הפוונקציות גלגול:template <class T>void BRtree<T>::Right(Node<T>*current){//current->x Node<T>*ezer=current->parent; if(current->right!=NULL) { ezer->left=current->right; } else { ezer->left=NULL; } current->right= ezer; if(ezer->parent==NULL) { current->parent=NULL; } else { current->parent=ezer->parent; if(ezer->parent->right==ezer) { ezer->parent->right=current; } else { ezer->parent->left=current; } } ezer->parent=current; if(current->parent==NULL) { root=current; }}template <class T>void BRtree<T>::Left(Node<T>*current){//current=y Node<T>*ezer=current->parent; if(current->left!=NULL) { ezer->right=current->left; } else { ezer->right=NULL; } current->left= ezer; if(ezer->parent==NULL) { current->parent=NULL; } else { current->parent=ezer->parent; if(ezer->parent->right==ezer) { ezer->parent->right=current; } else { ezer->parent->left=current; } } ezer->parent=current; if(current->parent==NULL) { root=current; }}
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.