תכנות, רקורסיה, מערכים, מחרוזות, עצים בינאריים ורשימות מקושרות
IntegerBinaryTree, IntegerBinaryNode, המחלקות את המרחיבות BinaryTree<Integer>, BinaryNode<Integer> בהתאמה.IntegerBinaryTree את השיטה הבוליאנית pathSum(int sum) אשר מקבלת מספר שלם sum ומחזירה ערך true אם קיים מסלול כלשהו בעץ מהשורש לעלה אשר סכום המספרים בקודקודי המסלול הוא בדיוק sum. אם לא קיים מסלול כזה השיטה מחזירה ערך false (5 נקודות).IntegerBinaryNode (10 נקודות). 5
/ \
1 7
/ / \
6 2 9
/
4
canFactorizeToTarget(int[] primes, int n) המקבלת מערך לא ריק של מספרים ראשוניים יחודיים ומספר n גדול או שווה ל-2, ומחזירה ערך true אם ניתן לייצג את n כמכפלת גורמים ראשוניים מהמערך primes (כלומר, כל הגורמים הראשוניים השונים של n נמצאים במערך primes). אחרת הפונקציה מחזירה false. כל גורם במערך יכול להופיע במכפלה מספר לא מוגבל של פעמים. המערך לא בהכרח ממויין. 5
/ \
1 8
\ / \
2 6 9
/
7
BinarySearchTree את השיטה searchPathString(T element) אשר מקבלת איבר element ומחזירה את מחרוזת החיפוש של element בעץ.BinarySearchNode. השיטה במחלקה זו מקבלת איבר element ופרמטר נוסף אותו עליכם לקבוע.almostPalindrome(String s) המקבלת מחרוזת s שונה מ-null, ובודקת האם היא כמעט פלינדרום.TreeNode ו-BinarySearchTree יכילו את השדות הבאים (השינוי מהכיתה מסומן בקו תחתון):>>> print(tree.root.right.key_range) → (19, 38)update_key_range() למחלקה TreeNode, שתעדכן את השדה key_range של הצומת לערכיו התקינים לפי ההגדרה שצוינה.update_all_key_range(self) אשר מעדכנת את טווחי המפתחות בכל הצמתים בעץ, תוך שימוש במתודה שמומשה בסעיף א'. הקוד הבא מציע מימוש:update_key_range_2.update_all_key_range, אך ורק על ידי החלפת הקריאה ל-update_key_range בקריאה ל-update_key_range_2.update_all_key_range במקרה הגרוע כתלות בכמות הצמתים (). בנוסף, ציינו האם הקוד נכון, ואם אינו נכון הציעו תיקון (בקצרה).treeComparator) וכמו כן הוא "קטן" מכל הערכים בתת-העץ הימני שלו. בעץ אין איברים שווים.BinarySearchNode<T>, כמפורט בסעיפים א' וב'. בנוסף, עומדות לרשותכם שתי שיטות בהן תוכלו להיעזר כרצונכם:T findMin() מחזירה את הערך המינימלי בתת-העץ המושרש בקודקוד הנוכחי.T findMax() מחזירה את הערך המקסימלי בתת-העץ המושרש בקודקוד הנוכחי.private boolean replace(T newData) אשר מקבלת ערך newData ובודקת האם ניתן להחליף בינו לערך השדה data כך שתת העץ המושרש בקודקוד הנוכחי נשאר עץ חיפוש בינארי. אם התשובה חיובית, השיטה מבצעת את ההחלפה ומחזירה true. אחרת השיטה מחזירה false, וערך השדה data אינו משתנה.return מעבר לפקודה הניתנת בתבנית (השורה האחרונה בשיטה). 7
/ \\
2 11
/ \ \\
1 4 13
\\
14
true כי אם מחליפים את ערכו של השורש ב-5 תת-העץ המושרש בו נשאר עץ חיפוש בינארי.false והעץ לא ישתנה, כי תת-העץ המתקבל לאחר החלפת ערכו של השורש ב-3, 12 או 0 איננו עץ חיפוש בינארי.public boolean replace(T replaceMe, T newData) המקבלת שני ערכים replaceMe ו-newData.replaceMe בערך newData אם ניתן לעשות זאת - ניתן לבצע את ההחלפה אם קיים קודקוד בתת העץ שערכו replaceMe ולאחר ההחלפה העץ נשאר עץ חיפוש בינארי.false.node:node:
7
/ \\
2 11
/ \ \\
1 4 13
\\
14
node.replace(2,3):
7
/ \\
3 11
/ \ \\
1 4 13
\\
14
node.replace(2, 3) יוחזר הערך true ויתקבל תת העץ מימין.node.replace(2, 6) יוחזר הערך false ולא יבוצע שינוי בעץ מאחר שאם תתבצע ההחלפה העץ לא יישאר עץ חיפוש בינארי.node.replace(5, 6) יוחזר false ולא יבוצע שינוי בעץ מאחר שלא קיים בתת-העץ שמושרש ב-node קודקוד שערכו 5.return מעבר לפקודה הניתנת בתבנית (השורה האחרונה בשיטה).longest_monotone למטה. הפונקציה מקבלת מחרוזת המורכבת מאותיות קטנות באנגלית ('a','b','c',...,'z'), ומחזירה את האורך המקסימלי של תת מחרוזת מונוטונית עולה של . דוגמאות:שאלות תרגול במבוא למדעי המחשב בנושא רקורסיה ממבחנים של האוניברסיטה הפתוחה, אוניברסיטת תל אביב, אוניברסיטת בר-אילן, הטכניון. השאלות ממוינות לפי רמת קושי, עם פתרונות לבדיקה עצמית - כך שניתן ללמוד מטעויות ולהבין את דרך הפתרון לפני הבחינה. ניתן לאתר שאלות חוזרות ולהריץ מבחני סימולציה ממוקדים בנושא רקורסיה.