Ort Braude Academic College

‫המחלקה להנדסת תכנה‬
‫חורף ‪2102-01‬‬
‫מכללת אורט בראודה‬
‫אלגוריתמים ומבנה נתונים‬
‫תרגיל בית מספר ‪2‬‬
‫תאריך הגשה‪ :‬יום ה' ‪ ,22.00.00‬אלי לדוא"ל‬
‫יש לכתוב פתרונות קצרים‪ ,‬מדויקים וברורים‪ .‬פתרונות בלתי ברורים יגררו הורדת נקודות‪.‬‬
‫שאלה ‪1‬‬
‫נתון מערך ‪ A‬בעל ‪ n‬מספרים שלמים בטווח של ‪ 1‬עד ‪ .k‬הציעו מבנה נתונים אשר יאפשר לענות על השאילתה‬
‫הבאה ב – )‪ .O(1‬בהינתן שני מספרים ‪ a‬ו – ‪ b‬כמה מספרים נמצאים בטווח ]‪.[a,b‬‬
‫נתחו את סיבוכיות הזמן והמקום של מבנה הנתונים שהצעתם ונמקו את זמן השאילתה‪.‬‬
‫שאלה ‪2‬‬
‫כידוע ישנם שלושה סוגי סריקות של עצים‪ :‬תחילי )‪ ,(preorder‬תוכי )‪ ,(inorder‬סופי )‪ .(postorder‬בד"כ‬
‫כותבים ביטויים מתמטיים בכתיב תוכי‪ .‬מחשבון ‪ HP‬מקבל קלט כביטוי סופי‪ ,‬שפות כמו ‪ Lisp‬ו‪Scheme-‬‬
‫עובדות עם ביטויים תחיליים‪ .‬פונקציות כתובות כביטוי תחילי‪ ,‬קודם שם הפונקציה ואז הארגומנטים‪ .‬הדוגמא‬
‫הבאה היא של עץ ביטויים‪ .‬הפעולות מיוצגות בצמתים פנימיים‪ ,‬והערכים בעלים‪ .‬סריקה תוכית של העץ תיתן‬
‫את הביטוי הבא‪:‬‬
‫‪a * b + c – d * e – f- g + h – i / j *k * l‬‬
‫בכדי שסדר העדיפויות יהיה ברור ניתן לשים סוגריים‪ .‬הסוגריים באים רק בכדי להראות את סדר הפעולות אבל‬
‫אינם חלק מהעץ‪.‬‬
‫)))‪((((a * b) + ((c – d) * e)) – f) – ((g + ((h – i) / j)) * (k * l‬‬
‫‬‫‬‫*‬
‫‪f‬‬
‫*‬
‫‪+‬‬
‫‪+‬‬
‫*‬
‫‪l‬‬
‫‪k‬‬
‫*‬
‫‪g‬‬
‫‪/‬‬
‫‪-‬‬
‫‪e‬‬
‫‪-‬‬
‫‪j‬‬
‫‪b‬‬
‫‪i‬‬
‫‪h‬‬
‫‪d‬‬
‫‪a‬‬
‫‪c‬‬
‫א‪ .‬ה אם ניתן לשחזר את העץ מתוך הסריקה התוכית שנתונה למעלה (עם הסוגריים)‪ .‬אם כן‪ ,‬יש לתת‬
‫אלגוריתם לשחזור העץ‪ .‬אם לא יש להוכיח מדוע לא ניתן (לתת דוגמא נגדית)‪.‬‬
‫ב‪.‬‬
‫יש לתת את הסריקה התחילית והסופית של עץ הביטויים שלמעלה‪.‬‬
‫ג‪.‬‬
‫יש לכתוב פונקציה בשם ‪ CalcTree‬המקבלת מצביע לעץ ‪ ,T‬ומחזירה את הערך שצריך להיות בראש‬
‫העץ‪ .‬הפונקציה תהיה חלק מהתכנית המורכבת באופן הבא‪:‬‬
‫המחלקה להנדסת תכנה‬
‫חורף ‪2102-01‬‬
‫מכללת אורט בראודה‬
‫אלגוריתמים ומבנה נתונים‬
‫‪ .0‬הגדרת צומת בעץ‪:‬‬
‫{ ‪typedef struct node‬‬
‫{ ‪union t‬‬
‫;‪char oper‬‬
‫;‪int number‬‬
‫;}‬
‫)‪// leaf == 1 (int in union), ==0 (oper in nonleaf‬‬
‫;‪int leaf‬‬
‫;‪struct node * left, right‬‬
‫;‪} NODE‬‬
‫‪ .2‬פונקציה שתקרא ביטוי תוכי (עם סוגריים) – ותבנה ממנו עץ‪.‬‬
‫)‪NODE * BuildTree( char *expression‬‬
‫‪.1‬‬
‫הפונקציה תהיה לא רקורסיבית‪ ,‬ותשתמש במחסנית בכדי לחשב את הביטוי שנמצא בעץ‪.‬‬
‫שאלה ‪1‬‬
‫נתונה מטריצה ריבועית בגודל ‪ n × n‬המקיימת את הכלל‪ ,‬שבכל שורה או עמודה יש לכל היותר איבר אחד‬
‫בלבד השונה מ‪.1 -‬‬
‫יש להציע מבנה נתונים למטריצה‪ ,‬כך שמימוש פעולות )‪ get( i, j‬ו‪ put( i, j, x) -‬יהיה בסיבוכיות זמן )‪,O(1‬‬
‫ובסיבוכיות מקום )‪ .O(n‬בפעולת ‪ put‬אם קיים איבר אחר באותה שורה או עמודה יש לבטל את האיבר הקודם‪,‬‬
‫כך שהמטריצה תמשיך לקיים את הכלל שלעיל‪.‬‬
‫הדגימו את המימוש על המטריצה הבאה‪:‬‬
‫‪0‬‬
‫‪5‬‬
‫‪0‬‬
‫‪0‬‬
‫‪0‬‬
‫‪1‬‬
‫‪7‬‬
‫‪0‬‬
‫‪0‬‬
‫עבור הפעולות הבאות‪:‬‬
‫)‪get( 1, 3‬‬
‫)‪get( 2, 1‬‬
‫)‪put(3, 2, 6‬‬
‫שאלה ‪4‬‬
‫בהינתן צומת ‪ u‬נסמן ב‪ Tree-Successor(u)-‬את העוקב בסדר ‪ in-order‬של ‪ u‬ונסמן ב‪Tree--‬‬
‫)‪ Predecessor(u‬את הקודם ל‪( u-‬שוב ב ‪.in-order‬‬
‫הוכח או הפרך‪.‬‬
‫א‪ .‬יהי ‪ T‬עץ חיפוש בינארי ויהי ‪ u‬צומת בעץ שאינו עלה אז‬
‫ב‪ .‬יהי ‪ T‬עץ חיפוש בינארי ויהי ‪ u‬צומת בעץ שאינו עלה אז‬
‫ג‪.‬‬
‫הוא עלה‬
‫הוא עלה‬
‫פעולת המחיקה מעץ חיפוש בינארי היא חילופית (כלומר העץ המתקבל ממחיקת ‪ x‬ולאחריו ‪ y‬הוא‬
‫אותו העץ כמו למחוק את ‪ y‬ולאחריו את ‪)x‬‬
‫מכללת אורט בראודה‬
‫אלגוריתמים ומבנה נתונים‬
‫ד‪.‬‬
‫המחלקה להנדסת תכנה‬
‫חורף ‪2102-01‬‬
‫אם לצומת בעץ חיפוש בינארי שני בנים‪ ,‬אזי לצומת העוקב (בסדר ‪ )inorder‬אין בן שמאלי ולצומת‬
‫הקודם (בסדר ‪ )inorder‬אין בן ימני‪.‬‬
‫בהצלחה!!‬