שאלת מבחן במבוא למדעי המחשב - אוניברסיטת תל אביב 2016 - עצים בינאריים

עץ חיפוש בינארי - מימוש איטרטיבי ומבנה מעגלי

להלן תזכורת למחלקה "עץ בינארי" שראינו בכיתה, וכן לפונקציה lookup:



א. השלימו את המימוש האלטרנטיבי הבא ל-lookup, שלא עושה שימוש ברקורסיה (מימוש איטרטיבי):



ב. התבוננו כעת בקוד הבא, שמשתמש במחלקה באופן שחורג (מאוד!) מהשימוש הסטנדרטי שלה:



(i) מה יקרה אם נבצע את הקריאה lookup_iterative(Node1, 4)?
(ii) מה יקרה אם נבצע את הקריאה lookup_iterative(Node1, 7)?

(iii) מה יקרה אם נבצע את הקריאה lookup_iterative(Node1, 12)?


ג. כתבו מחדש את הקוד של lookup_iterative מסעיף א, כך שיחזיר תשובה נכונה גם במקרים הבעייתיים מבין אלו שהודגמו לעיל. כלומר יש לקיים את התכונה הבאה:

אם קיים רצף של Tree_nodes, נסמנו , כך ש-, ולכל מתקיים או , אז על הפונקציה להחזיר את . אחרת על הפונקציה להחזיר None.

דרישה: על הקוד להיות ללא רקורסיה (איטרטיבי).

ניתן להניח שכל מפתח מופיע לכל היותר פעם אחת, וכן שלכל צומת, המפתח של בנו השמאלי המיידי קטן יותר, והמפתח של בנו הימני המיידי גדול יותר. אין להניח הנחות נוספות לגבי המבנה או סדר הופעת המפתחות.

העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת תל אביבמועד ב2016סמסטר ב
עצים בינארייםעץ חיפוש בינארילולאות
בסעיף א: השתמשו בלולאת while שממשיכה כל עוד root אינו None ו-key שונה מ-root.key. בסעיף ב: שימו לב שהמבנה מכיל מעגל (Node3.left = Node1), כך שחיפוש ערך שלא קיים ייכנס ללולאה אינסופית. בסעיף ג: השתמשו בקבוצת visited (set) כדי לזהות צמתים שכבר ביקרנו בהם ולהימנע מלולאה אינסופית.
א.



ב.
המבנה שנוצר: Node1(5) -> left=Node2(4), right=Node3(9). Node3(9) -> left=Node1(5), right=Node(11). יש מעגל: Node1 -> Node3 -> Node1.


(i) lookup_iterative(Node1, 4): key=4 < 5, עוברים ל-Node2(4). key==4, מחזירים "b". התוצאה: "b".

(ii) lookup_iterative(Node1, 7): key=7 > 5, עוברים ל-Node3(9). key=7 < 9, עוברים ל-Node1(5) (כי Node3.left = Node1). key=7 > 5, עוברים ל-Node3(9). לולאה אינסופית - התוכנית נתקעת.

(iii) lookup_iterative(Node1, 12): key=12 > 5, עוברים ל-Node3(9). key=12 > 9, עוברים ל-Node(11). key=12 > 11, עוברים ל-None. התוצאה: None.

ג.



הסבר: שומרים קבוצה של צמתים שכבר ביקרנו בהם. אם מגיעים לצומת שכבר ביקרנו בו, פירושו שנכנסנו למעגל, ולכן המפתח לא קיים ומחזירים None.