עץ בינארי הוא אמצעי לאחסון נתונים. אנו אומרים כי עץ בינארי הוא מבנה נתונים מופשט (Abstract Data Type, ADT), אותו נוכל לממש בתכנית מחשב בדרכים שונות.
כתבו תכנית המגדירה שני מצביעים לעצי חיפוש בינאריים, קוראת סדרת מספרים עד קבלת הערך אפס, ומכניסה את כל הערכים החיוביים לעץ חיפוש בינארי אחד, ואת כל הערכים השליליים לעץ חיפוש בינארי שני.
כתבו תכנית המגדירה מצביעים לעצי חיפוש בינאריים, קוראת סדרת מספרים עד קבלת הערך אפס, ומכניסה את כל הערכים החיוביים לעץ חיפוש בינארי אחד, ואת כל הערכים השליליים לעץ חיפוש בינארי שני.
את הערכים הוסיפו באמצעות פונ' הכנסה לעץ המקבלת מצביע למצביע.
כתבו תכנית הקוראת סדרת מספרים שלמים, עד קבלת הערך אפס, ובונה מהם עץ חיפוש בינארי.
עתה התכנית מציגה את הערכים החיוביים בלבד בעץ.
כתבו תכנית הקוראת סדרת ערכים עד קבלת הערך אפס ובונה מהם עץ.
אופן בניית העץ יהיה הבא:
עתה התכנית קוראת ערך נוסף, ומציגה כמה פעמים הערך מופיע בעץ.
כתבו תכנית הקוראת סדרת מספרים שלמים, עד קבלת הערך אפס, ובונה מהם עץ חיפוש בינארי.
עתה התכנית מציגה את הערך הקטן ביותר, ואת הערך הגדול ביותר, בעץ. יש להשלים את המשימה על-ידי זימון פונ' שמאתרת את המינימאלי בעץ, ופונ' שניה (או אותה פונ' עם פרמטרים מעט שונים) שמאתרת את המקסימאלי. על דרך השלילה: אין לאתר את הערך המזערי והמרבי בעת קריאת הקלט ובניית העץ.
כתבו תכנית הקוראת סדרת מספרים שלמים, עד קבלת הערך אפס, ובונה מהם עץ חיפוש בינארי.
עתה התכנית סופרת ומציגה, כמה עלים יש בעץ.
כתבו תכנית הקוראת סדרת ערכים עד קבלת הערך אפס ובונה מהם עץ.
אופן בניית העץ יהיה הבא:
עתה התכנית מזמנת פונ' המוצאת את עומקו של העץ. התכנית מציגה את הנתון.
כתבו תכנית הקוראת סדרת ערכים עד קבלת הערך אפס ובונה מהם עץ חיפוש בינארי.
עתה זמנו פונ' שבודקת האם כל צומת בעץ מקיים ש:
א. אם לצומת יש ילד שמאלי, אזי הערך בילדו השמאלי מחלק את הערך בצומת
ב. אם לצומת יש ילד ימני, אזי הערך בילדו הימני מתחלק בערך בצומת
הפונ' תחזיר את הערך true אם כל הצמתים בעץ מקיימים את התכונה, ואת הערך false אחרת.
התכנית הרשית תציג פלט בהתאם לערך שהפונ' מחזירה.
לבעיה זאת אציג שני פתרונות:
א. פתרון נאיבי יותר, וקל יותר להבנה ולמימוש, אך למרבה הצער: כזה שזמן הריצה שלו עלול להיות ריבועי במספר הצמתים בעץ
ב. פתרון מתוחכם יותר, מאתגר יותר להבנה ולמימוש, אך למרבה השמחה: כזה שזמן הריצה שלו הוא ליניארי בגודל העץ
נתחיל בפתרון הנאיבי יותר, ואחר נתקדם גם לפתרון המורכב יותר.
אלגוריתם זה הוא אחד המורכבים שנראה בקורס.
כדי להציגו, אתחיל בסרטון שדן ב'קודם בעץ' של ערך
באופן סימטרי ל'קודם בעץ' אנו יכולים לדבר על ה-'עוקב בעץ' של ערך v (שאינו הערך הגדול ביותר בעץ): זהו הערך שיוצג בדיוק אחרי v עת נציג את העץ ממוין (נבקר בו בביקור תוכי).
כתבו תכנית הבונה עץ חיפוש בינארי, ואחר קוראת מספר.
אם המספר אינו מצוי בעץ היא מודיעה על כך.
אם המספר מצוי בעץ בצומת שאין לו שני ילדים היא נותנת הודעה שניה.
אם המספר מצוי בצומת עם שני ילדים אזי התכנית מזמנת פונ' למציאת העוקב בעץ של הערך, ואחר מציגה את העוקב.
לסיום, הפונ' משחררת את העץ.
על שלושת המקרים השונים שוא כולל:
למותר לציין, בשלב זה, שעצים הם נושא 'לא טריביאלי', בהתאמה, גם התרגילים בהם הם, לא אחת, קשים. מצד שני: בדיוק מסיבה זאת, חשוב לתרגל את הנושא היטב...
כי כמו שכבר נאמר: 'קשה באימונים, קל בקרב'