חומרי לימוד - מדעי המחשב

‫כ"ה‪/‬אייר‪/‬תשע"ה‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫‪‬‬
‫‪‬‬
‫הגדרה‪-‬‬
‫עץ חיפוש בינארי הוא ‪ -‬עץ בינארי של מספרים אשר בכל צומת‬
‫שלו מתקיים שכל הערכים בתת העץ הימני שלו (אם קיים)‬
‫גדולים מהערך בצומת‪ ,‬וכל הערכים בתת העץ השמאלי שלו‬
‫(אם קיים) קטנים מהערך בצומת‪.‬‬
‫‪1‬‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫עץ חיפוש בינארי ‪ -‬דוגמה‬
‫‪10‬‬
‫‪15‬‬
‫‪26‬‬
‫‪5‬‬
‫‪9‬‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫תשע"ה‬/‫אייר‬/‫כ"ה‬
‫השימוש בעץ בינארי – הגדרה‬
‫הגדרה‬
‫יצירת מופע חדש של עץ בינארי‬
BinTreeNode<‫ >טיפוס ערכי העץ‬tree = new
BinTreeNode<‫;)ערך לשורש העץ – בהתאם לטיפוסו(>טיפוס ערכי העץ‬

12 ‫ בשורש העץ המספר‬,‫ כעץ שלמים‬tree ‫ הגדרת‬,‫למשל‬
BinTreeNode<int> tree = new BinTreeNode<int>(12);

3

Binary Search Tree – ‫עץ חיפוש בינארי‬
‫ מציאת איבר‬- ‫עץ חיפוש בינארי‬
public static bool IsXinSearchTree(BinTreeNode<int> t, int x)
‫ הנחה – העץ אותחל‬.t ‫ נמצא בעץ החיפוש הבינארי‬x ‫הפעולה מחזירה האם הערך‬//
{
if(t == null)
return false;
else
if (t.GetInfo() == x)
return true;
else
if (x < t.GetInfo())
return IsXinSearchTree(t.GetLeft(),x);
else
return IsXinSearchTree(t.GetRight(),x);
}
4
2
Binary Search Tree – ‫עץ חיפוש בינארי‬
‫כ"ה‪/‬אייר‪/‬תשע"ה‬
‫עץ חיפוש בינארי ‪ -‬מציאת איבר ‪ -‬סיבוכיות זמן הריצה‬
‫‪‬‬
‫צריך להבחין בין שני מקרי קצה של מבנה העץ‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫כאשר לכל צומת צאצא בודד‬
‫‪‬‬
‫‪‬‬
‫לכל צומת צאצא בודד‬
‫כאשר העץ מלא (מאוזן‪ ,‬לכל צומת שני בנים עד לשלב האחרון ‪-‬‬
‫הנמוך ביותר‪ ,‬שם כולם עלים)‪.‬‬
‫סיבוכיות זמן הריצה היא ‪ ,O(n) -‬שכן‪ ,‬במקרה הגרוע ביותר‪ ,‬האיבר‬
‫נמצא בצומת ברמה התחתונה ביותר (או לא נמצא כלל בעץ) ‪ -‬מה‬
‫שיחייב מעבר על ‪ n‬צמתי עץ החיפוש הבינארי‪.‬‬
‫כאשר העץ מלא‬
‫‪‬‬
‫סיבוכיות זמן הריצה היא ‪ ,O(log2n) -‬שכן‪ ,‬בכל פעם החיפוש ימשיך‬
‫להתבצע רק על אחד משני תתי העצים‪.‬‬
‫‪5‬‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫עץ חיפוש בינארי ‪ -‬מציאת איבר ‪ -‬מעקב‬
‫האם ‪ 9‬נמצא ‪-‬‬
‫בעץ החיפוש הבינארי הבא?‬
‫‪9‬‬
‫‪10‬‬
‫‪15‬‬
‫‪26‬‬
‫‪5‬‬
‫‪9‬‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫‪9‬‬
‫‪9‬‬
‫‪3‬‬
‫‪6‬‬
‫‪3‬‬
‫תשע"ה‬/‫אייר‬/‫כ"ה‬
‫עץ חיפוש בינארי – הוספת איבר‬
public static void AddToSearchTree(BinTreeNode<int> t, int x)
{
‫ העץ אותחל ואינו ריק‬- ‫ הנחה‬,‫מוסיפה את המספר השלם לעץ החיפוש הבינארי‬//
if (x < t.GetInfo())
‫ מוסיפים לעץ בן שמאלי עם המספר‬- ‫אם לא קיים בן שמאלי‬//
if (t.GetLeft() == null)
t.SetLeft(new BinTreeNode<int>(x));
else
AddToSearchTree(t.GetLeft(), x);
else
if (x > t.GetInfo())
‫ מוסיפים לעץ בן ימני עם המספר‬- ‫אם לא קיים בן ימני‬//
if (t.GetRight() == null)
t.SetRight(new BinTreeNode<int>(x));
else
AddToSearchTree(t.GetRight(), x);
}7
Binary Search Tree – ‫עץ חיפוש בינארי‬
‫ מעקב‬- ‫עץ חיפוש בינארי – הוספת איבר‬
8
8
5
15
8
3
10
- 8 ‫הוספת‬
‫לעץ החיפוש הבינארי הבא‬
9
8
8
4
Binary Search Tree – ‫עץ חיפוש בינארי‬
26
‫כ"ה‪/‬אייר‪/‬תשע"ה‬
‫עץ חיפוש בינארי ‪ -‬תרגילים‬
‫א‪ -‬כתוב פעולה חיצונית המחזירה את הערך הגדול ביותר בעץ חיפוש בינארי של‬
‫מספרים שלמים‬
‫ב‪ -‬מה סיבוכיות זמן הריצה של הפעולה שרשמת בסעיף א'? נמק‪.‬‬
‫הפתרון‬
‫)‪public static int BiggestInTree(BinTreeNode<int> t‬‬
‫‪//‬הפעולה מחזירה את הערך הגדול ביותר בעץ החיפוש הבינארי ‪ .t‬הנחה – העץ אותחל ואינו ריק‬
‫{‬
‫)‪if((t.GetRight() == null‬‬
‫;)(‪return t.GetInfo‬‬
‫‪else‬‬
‫;))(‪return BiggestInTree(t.GetRight‬‬
‫סיבוכיות זמן הריצה של הפעולה היא בין‬
‫)‪ O)n‬ל‪-‬‬
‫}‬
‫)‪O)log2n‬‬
‫עבור עץ שכל הצמתים בו ימניים – יסרקו בדיוק פעם אחת כל צמתי העץ‪.‬‬
‫עבור עץ מלא – בכל פעולה רקורסיבית יבחר רק חצי מהעץ (הימני) להמשך הסריקה‪.‬‬
‫‪9‬‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫עץ חיפוש בינארי ‪ -‬תרגילים‬
‫א‪ -‬כתוב פעולה חיצונית המקבלת שני עצי חיפוש בינאריים ‪ t1,t2‬שניהם של מספרים‬
‫שלמים ובשניהם אין חזרות על ערכים‪ .‬הפעולה תחזיר האם כלל הערכים ב‪t1-‬‬
‫נמצאים ב‪.t2-‬‬
‫ב‪ -‬מה סיבוכיות זמן הריצה של הפעולה שרשמת בסעיף א'? נמק‪.‬‬
‫)‪public static bool IsTree1InTree2(BinTreeNode<int> t1, BinTreeNode<int> t2‬‬
‫‪//‬הפעולה מחזירה האם העץ ‪ t1‬מוכל בעץ החיפוש הבינארי ‪ .t2‬הנחה – העצים אותחלו‬
‫{‬
‫)‪if (t1 == null‬‬
‫;‪return true‬‬
‫‪else‬‬
‫)))(‪if (!IsXinSearchTree(t2, t1.GetInfo‬‬
‫;‪return false‬‬
‫‪else‬‬
‫)‪return IsTree1InTree2(t1.GetRight(), t2‬‬
‫;)‪&& IsTree1InTree2(t1.GetLeft(), t2‬‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫‪} 10‬‬
‫‪5‬‬
‫כ"ה‪/‬אייר‪/‬תשע"ה‬
‫עץ חיפוש בינארי ‪ -‬תרגילים‬
‫)‪public static bool IsTree1InTree2(BinTreeNode<int> t1, BinTreeNode<int> t2‬‬
‫‪//‬הפעולה מחזירה האם העץ ‪ t1‬מוכל בעץ החיפוש הבינארי ‪ .t2‬הנחה – העצים אותחלו‬
‫{‬
‫)‪if (t1 == null‬‬
‫;‪return true‬‬
‫‪else‬‬
‫)))(‪if (!IsXinSearchTree(t2, t1.GetInfo‬‬
‫;‪return false‬‬
‫‪else‬‬
‫)‪return IsTree1InTree2(t1.GetRight(), t2‬‬
‫;)‪&& IsTree1InTree2(t1.GetLeft(), t2‬‬
‫}‬
‫ב‪ -‬מה סיבוכיות זמן הריצה של הפעולה שרשמת בסעיף א'? נמק‪.‬‬
‫סיבוכיות זמן הריצה של הפעולה היא בין )‪ O)n∙m‬ל‪-‬‬
‫שכן‪ ,‬עבור גודל ‪ ,n - t1‬פעולת העזר ‪-‬‬
‫‪ IsXinSearchTree‬היא בין‬
‫)‪ O)n‬ל‪-‬‬
‫)‪O)m ∙ log2n‬‬
‫)‪O) log2n‬‬
‫והפעולה העיקרית ‪ - IsTree1InTree2 -‬מופעלת רקורסיבית עבור כל צמתי העץ ‪ t2‬שגודלו ‪m‬‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫‪11‬‬
‫עץ חיפוש בינארי ‪ -‬תרגילים‬
‫א‪ -‬כתוב פעולה חיצונית המקבלת עץ חיפוש בינארי ורשימה ממוינת שניהם של מספרים‬
‫שלמים‪ .‬הפעולה תחזיר רשימה חדשה וממוינת המכילה את כלל הערכים של העץ‬
‫ובנוסף את כל הערכים של הרשימה‬
‫ב‪ -‬מה סיבוכיות זמן הריצה של הפעולה שרשמת בסעיף א'? נמק‪.‬‬
‫עץ חיפוש בינארי – ‪Binary Search Tree‬‬
‫‪12‬‬
‫‪6‬‬