בי מאסטר (Bmaster)מאגר שאלות בגרותשאלות נפוצותמדריכיםארכיון בגרויות
תפריט

חומרי לימוד

מאגר שאלות בגרותשאלות נפוצותמדריכיםארכיון בגרויות
חזרה למאגר2016 קיץ מועד א

רשימה דו־כיוונית: השלמת firstLeft ומעקב

שאלה קודמתשאלה הבאה
שאלה 5מבני נתונים2016 קיץ מועד א

רשימה דו־כיוונית: השלמת firstLeft ומעקב

נגדיר רשימה דו־כיוונית כאוסף סדור של חוליות מטיפוס BinNode<Integer> (ב-Java) או BinNode<int> (ב-C#) המקושרות כך: לכל זוג חוליות p1, p2 ברשימה, אם מתקיים p1.getRight() == p2 אז מתקיים גם p2.getLeft() == p1. ברשימה דו־כיוונית יש לפחות שתי חוליות.

כלומר: כל חוליה ברשימה — חוץ מהחוליה שבקצה הימני של הרשימה והחוליה שבקצה השמאלי של הרשימה — מצביעה על החוליה שלפניה ועל החוליה שאחריה.

לפניכם דוגמה לרשימה דו־כיוונית ומשתנה pos מטיפוס BinNode<Integer> המצביע על חוליה כלשהי ברשימה. המשתנה pos מצביע על החוליה שערכה 11:

null131027118nullpos

הפעולה firstLeft (ב-C#: FirstLeft) מקבלת מצביע pos שונה מ-null המצביע על חוליה כלשהי ברשימה דו־כיוונית, ומחזירה את החוליה השמאלית ביותר ברשימה. הפעולה firstRight (ב-C#: FirstRight) מחזירה בהתאמה את החוליה הימנית ביותר.

1// שלד הפעולה firstLeft (להשלמה בסעיף א):
2public static BinNode<Integer> firstLeft(BinNode<Integer> pos)
3{
4    while ( ______________ )
5        pos = ______________ ;
6    return ______________ ;
7}
8
9// הפעולה what (נתונה — למעקב בסעיף ב):
10public static boolean what(BinNode<Integer> pos)
11{
12    BinNode<Integer> left = firstLeft(pos);
13    BinNode<Integer> right = firstRight(pos);
14    int sum = left.getValue() + right.getValue();
15    left = left.getRight();
16    right = right.getLeft();
17    while ((left != right) && (left.getRight() != right) &&
18           (left.getValue() + right.getValue() == sum))
19    {
20        left = left.getRight();
21        right = right.getLeft();
22    }
23    if (left == right)
24        return right.getValue() == sum;
25    if (left.getRight() == right)
26        return left.getValue() + right.getValue() == sum;
27    return false;
28}

משימות

אמשימה אcode

העתיקו את שלד הפעולה firstLeft (ב-C#: FirstLeft) והשלימו אותו, כך שהפעולה תבצע את הנדרש — תחזיר את החוליה השמאלית ביותר ברשימה.

במשימה בtext

עקבו אחר ביצוע הפעולה what (ב-C#: What) הנתונה, בעבור המשתנה pos והרשימה שבדוגמה שבתיאור (pos מצביע על החוליה שערכה 11). במעקב הַראו את הרשימה הדו־כיוונית ואת ערכי המשתנים pos, left, right, sum, וכתבו את הערך הבוליאני שהפעולה מחזירה.

גמשימה גtext

קִבעו אם אפשר או אי אפשר להחליף את שלוש השורות האחרונות שבפעולה what — כלומר את שתי הוראות ה-if וההוראה return false — בהוראה היחידה:

return left.getValue() + right.getValue() == sum;

נמקו את קביעתכם.

שאלה 5מבני נתונים2016 קיץ מועד א

רשימה דו־כיוונית: השלמת firstLeft ומעקב

נגדיר רשימה דו־כיוונית כאוסף סדור של חוליות מטיפוס BinNode<Integer> (ב-Java) או BinNode<int> (ב-C#) המקושרות כך: לכל זוג חוליות p1, p2 ברשימה, אם מתקיים p1.getRight() == p2 אז מתקיים גם p2.getLeft() == p1. ברשימה דו־כיוונית יש לפחות שתי חוליות.

כלומר: כל חוליה ברשימה — חוץ מהחוליה שבקצה הימני של הרשימה והחוליה שבקצה השמאלי של הרשימה — מצביעה על החוליה שלפניה ועל החוליה שאחריה.

לפניכם דוגמה לרשימה דו־כיוונית ומשתנה pos מטיפוס BinNode<Integer> המצביע על חוליה כלשהי ברשימה. המשתנה pos מצביע על החוליה שערכה 11:

null131027118nullpos

הפעולה firstLeft (ב-C#: FirstLeft) מקבלת מצביע pos שונה מ-null המצביע על חוליה כלשהי ברשימה דו־כיוונית, ומחזירה את החוליה השמאלית ביותר ברשימה. הפעולה firstRight (ב-C#: FirstRight) מחזירה בהתאמה את החוליה הימנית ביותר.

1// שלד הפעולה firstLeft (להשלמה בסעיף א):
2public static BinNode<Integer> firstLeft(BinNode<Integer> pos)
3{
4    while ( ______________ )
5        pos = ______________ ;
6    return ______________ ;
7}
8
9// הפעולה what (נתונה — למעקב בסעיף ב):
10public static boolean what(BinNode<Integer> pos)
11{
12    BinNode<Integer> left = firstLeft(pos);
13    BinNode<Integer> right = firstRight(pos);
14    int sum = left.getValue() + right.getValue();
15    left = left.getRight();
16    right = right.getLeft();
17    while ((left != right) && (left.getRight() != right) &&
18           (left.getValue() + right.getValue() == sum))
19    {
20        left = left.getRight();
21        right = right.getLeft();
22    }
23    if (left == right)
24        return right.getValue() == sum;
25    if (left.getRight() == right)
26        return left.getValue() + right.getValue() == sum;
27    return false;
28}

משימות

אמשימה אcode

העתיקו את שלד הפעולה firstLeft (ב-C#: FirstLeft) והשלימו אותו, כך שהפעולה תבצע את הנדרש — תחזיר את החוליה השמאלית ביותר ברשימה.

במשימה בtext

עקבו אחר ביצוע הפעולה what (ב-C#: What) הנתונה, בעבור המשתנה pos והרשימה שבדוגמה שבתיאור (pos מצביע על החוליה שערכה 11). במעקב הַראו את הרשימה הדו־כיוונית ואת ערכי המשתנים pos, left, right, sum, וכתבו את הערך הבוליאני שהפעולה מחזירה.

גמשימה גtext

קִבעו אם אפשר או אי אפשר להחליף את שלוש השורות האחרונות שבפעולה what — כלומר את שתי הוראות ה-if וההוראה return false — בהוראה היחידה:

return left.getValue() + right.getValue() == sum;

נמקו את קביעתכם.