Presentation is loading. Please wait.

Presentation is loading. Please wait.

Trees, BSTs- עצים ועצי חיפוש בינאריים

Similar presentations


Presentation on theme: "Trees, BSTs- עצים ועצי חיפוש בינאריים"— Presentation transcript:

1 Trees, BSTs- עצים ועצי חיפוש בינאריים
תרגול 5 Trees, BSTs- עצים ועצי חיפוש בינאריים למה עצים? ds172-ps05

2 מה היה לנו ? ראינו איך מחשבים זמן ריצה של אלגוריתמים.
ראינו איך בונים מבני נתונים חדשים על סמך מבני הנתונים שהכרנו. ראינו איך עונים על שאילתות מסויימות בעזרת מבני הנתונים החדשים והישנים. ds172-ps05

3 מה יהיה לנו היום? נזכיר מהו עץ. דוגמאות לשימוש בעצים.
עץ חיפוש בינארי BST. חוקים ודוגמאות לשימוש בBST. ds172-ps05

4 Tree – עץ – הגדרות מבנה השומר את הנתונים באופן היררכי.
פרט לשורש, לכל קודקוד בעץ יש אב. לכל קודקוד בעץ יש 0 או יותר ילדים. פונקציות גישה במבנה נתונים אבסטרקטי של עץ: root() – returns the root of the tree parent(node v) – returns the parent of node v children(node v) – returns an iterator of the children of node v. ds172-ps05

5 Tree – עץ – הגדרות פונ' נוספות הנדרשות במבנה הנתונים: depth(node v)
depth(root) = 0 depth(v ≠ root) = depth(v.parent) + 1 height(node v) גובה של קודקוד v הוא מספר הקשתות במסלול הארוך ביותר בינו לעלה בעץ. height(v) = 0 , if v is a leaf height(v) = 1 + maximum-height of a child of v, if v is not a leaf. height() גובה של עץ הוא הגובה של השורש. ds172-ps05

6 Binary Tree – עץ בינארי – הגדרה
לכל קודקוד יש לכל היותר שני בנים, בן שמאלי ובן ימני. עץ בינארי מלא (full) – עץ שבו לכל קודקוד יש בדיוק 0 או 2 ילדים. עץ בינארי מלא עם L עלים מכיל L−1 קודקודים פנימיים. ds172-ps05

7 Binary Tree – עץ בינארי – הגדרה
עץ בינארי מושלם (perfect) – עץ בינארי מלא (שני בנים לכל קודקוד פנימי) שבו כל העלים הם מאותה רמה. ds172-ps05

8 Binary Tree – עץ בינארי – הגדרה
עץ בינארי שלם (complete) – עץ בינארי שגובהו ℎ ומקיים: לכל הקודקודים שלו עד עומק ℎ−2 יש בדיוק 2 בנים. כל הקודקודים בעומק ℎ (הרמה התחתונה בעץ) מרוכזים לשמאל. עץ בינארי שלם בגובה ℎ מכיל בין 2 ℎ ל 2 ℎ+1 −1 קודקודים. גובה של עץ בינארי מושלם עם 𝑛 קודקודים הוא log 𝑛 . ℎ=3 ds172-ps05 24 נובמבר 18

9 הליכות בעץ בינארי Preorder – visit the current node, preorder on its left sub tree and finally, preorder on its right sub tree. 15 Write current node Rec. call on left child 8 7 Rec. call on right child 3 12 13 Return Preorder: 15, 8, 3, 12, 7, 13 ds172-ps05

10 הליכות בעץ בינארי Inorder – inorder on the left sub tree, visit the current node and finally, inorder on the right sub tree. 15 Rec. call on left child Write current node 8 7 Rec. call on right child 3 12 13 Return Inorder: 3, 8, 12, 15, 7, 13 ds172-ps05

11 הליכות בעץ בינארי Postorder - postorder on the left sub tree, postorder on the right sub tree and finally, visit the current node. 15 Rec. call on left child Rec. call on right child 8 7 Write current node and Return 3 12 13 Postorder: 3, 12, 8, 13, 7, 15 ds172-ps05

12 k-Tree לכל קודקוד יש 𝑘 בנים לכל היותר.
ייצוג אפשרי : “left child - right sibling” כל קודקוד מחזיק את המצביעים הבאים: אב בן שמאלי – מצביע לבן השמאלי ביותר. אח מימין – מצביע לאח הימני הקרוב ביותר. ds172-ps05

13 k-Tree עוד דוגמא לייצוג ds172-ps05

14 תרגיל 1 – מעבר על עץ שחזרו את העץ הבינארי T מההליכות Preorder ו-Inorder הנתונות שלו: Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. לפי PreOrder נדע מהו השורש של העץ ולפי InOrder נדע מהם האיברים משמאל לשורש ומהם האיברים מימין לשורש. ds172-ps05

15 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. לפני השורש – תת-עץ שמאלי אחרי השורש – תת-עץ ימני שורש העץ ds172-ps05

16 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. לתת-עץ b,c,d אנחנו יודעים את ההליכות Preorder וInorder כיוון שהן ההליכות המושרות מT: Preorder: b,c,d. Inorder: c,d,b. ds172-ps05

17 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. לתת-עץ b,c,d אנחנו יודעים את ההליכות Preorder וInorder כיוון שהן ההליכות המושרות מT: Preorder: b,c,d. Inorder: c,d,b. ds172-ps05

18 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. לתת-עץ b,c,d אנחנו יודעים את ההליכות Preorder וInorder כיוון שהן ההליכות המושרות מT: Preorder: b,c,d. Inorder: c,d,b. ds172-ps05

19 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. לתת-עץ c,d אנחנו יודעים את ההליכות Preorder וInorder כיוון שהן ההליכות המושרות מT: Preorder: c,d. Inorder: c,d. ds172-ps05

20 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. לתת-עץ c,d אנחנו יודעים את ההליכות Preorder וInorder כיוון שהן ההליכות המושרות מT: Preorder: c,d. Inorder: c,d. ds172-ps05

21 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. Preorder: e,g,h,j,f. Inorder: h,g,j,e,f. ds172-ps05

22 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. Preorder: e,g,h,j,f. Inorder: h,g,j,e,f. ds172-ps05

23 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. Preorder: g,h,j. Inorder: h,g,j. ds172-ps05

24 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. Preorder: g,h,j. Inorder: h,g,j. ds172-ps05

25 תרגיל 1 שחזרו את העץ הבינארי T מההליכות Preorder וInorder הנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f. Inorder: c,d,b,a,h,g,j,e,f. טענה: משני הילוכים שונים בעץ T, כאשר אחד מהם הוא Inorder, ניתן לשחזר את העץ. אחת הדרכים להוכיח טענה זו היא ע"י שימוש בתהליך בו השתמשנו לפתרון התרגיל (באינדוקציה). ds172-ps05

26 תרגיל 2 האם תמיד ניתן לשחזר עץ בינארי מהליכות הPreorder וה Postorder שלו? הוכיחו את הטענה או תנו דוגמא נגדית פתרון: לא תמיד דוגמא: Preorder:  AB Postorder: BA ישנן שתי אפשרויות לעץ: A A B B ds172-ps05

27 תרגיל 3 לעץ בינארי T נגדיר
L(T) – מספר העלים בעץ T D2(T) – מספר הקודקודים בT עם דרגה 2 (2 ילדים בדיוק) הוכיחו שבכל עץ בינארי T עם n קודקודים מתקיים D2(T)=L(T)-1 אינטואיציה: כל קודקוד עם דרגה 1 לא מוסיף עלים. כל קודקוד עם דרגה 2 מוסיף פיצול בעץ שמוביל לעוד עלה. ds172-ps05

28 תרגיל 3 לעץ בינארי T נגדיר
L(T) – מספר העלים בעץ T D2(T) – מספר הקודקודים בT עם דרגה 2 (2 ילדים בדיוק) הוכיחו שבכל עץ בינארי T עם n קודקודים מתקיים D2(T)=L(T)-1 אינטואיציה: כל קודקוד עם דרגה 1 לא מוסיף עלים. כל קודקוד עם דרגה 2 מוסיף פיצול בעץ שמוביל לעוד עלה. ds172-ps05

29 תרגיל 3 לעץ בינארי T נגדיר
L(T) – מספר העלים בעץ T D2(T) – מספר הקודקודים בT עם דרגה 2 (2 ילדים בדיוק) הוכיחו שבכל עץ בינארי T עם n קודקודים מתקיים D2(T)=L(T)-1 אינטואיציה: כל קודקוד עם דרגה 1 לא מוסיף עלים. כל קודקוד עם דרגה 2 מוסיף פיצול בעץ שמוביל לעוד עלה. ds172-ps05

30 תרגיל 3 לעץ בינארי T נגדיר
L(T) – מספר העלים בעץ T D2(T) – מספר הקודקודים בT עם דרגה 2 (2 ילדים בדיוק) הוכיחו שבכל עץ בינארי T עם n קודקודים מתקיים D2(T)=L(T)-1 פתרון: הוכחה באינדוקציה על מספר הקודקודים בעץ. מקרה בסיס: n=1, L(T)=1, D2(T)=0 T ds172-ps05

31 תרגיל 3 T1 צ"ל 𝐷2(𝑇)=𝐿(𝑇) – 1 הוכחה באינדוקציה על מספר הקודקודים בעץ.
L(T) – מספר העלים 𝐷 2 (𝑇) – מספר הקודקודים עם דרגה 2 צ"ל 𝐷2(𝑇)=𝐿(𝑇) – 1 הוכחה באינדוקציה על מספר הקודקודים בעץ. צעד האינדוקציה: נניח שהטענה נכונה לכל k<n נסתכל על השורש בעץ עם n קודקודים 2 מקרים אפשריים: מקרה ראשון: דרגת השורש היא 1. ל T ולT1 יש אותו מספר עלים ל T ולT1 יש אותו מספר קודקודים עם דרגה 2 𝐷2(𝑇)=𝐷2(𝑇1)= 𝐿(𝑇1) – 1=𝐿(𝑇) – 1 T1 הנחת האינדוקציה 2 1 ds172-ps05

32 תרגיל 3 L(T) – מספר העלים 𝐷 2 (𝑇) – מספר הקודקודים עם דרגה 2 צ"ל 𝐷2(𝑇)=𝐿(𝑇) – 1 הוכחה באינדוקציה על מספר הקודקודים בעץ. צעד האינדוקציה: נניח שהטענה נכונה לכל k<n נסתכל על השורש בעץ עם n קודקודים 2 מקרים אפשריים: מקרה שני: דרגת השורש היא 2. מספר העלים ב T הוא סכום העלים בT1 וב T2 מספר הקודקודים עם דרגה 2 ב T הוא סכום הקודקודים עם דרגה 2 בT1 וב T2 ועוד קודקוד 1 (השורש) T1 T2 𝐷2 𝑇 = 𝐷2 𝑇1 + 𝐷2 𝑇2 + 1 = 𝐿 𝑇1 − 1 + 𝐿 𝑇2 − = 𝐿(𝑇) – 1 ע"פ הנחת האינדוקציה ע"פ 2 ע"פ 1 ds172-ps05

33 תרגיל 3 L(T) – מספר העלים 𝐷 2 (𝑇) – מספר הקודקודים עם דרגה 2 צ"ל 𝐷2(𝑇)=𝐿(𝑇) – 1 הוכחה באינדוקציה על מספר הקודקודים בעץ. צעד האינדוקציה: נניח שהטענה נכונה לכל k<n נסתכל על השורש בעץ עם n קודקודים 2 מקרים אפשריים: הערה: בעץ בינארי מלא (Full) מספר העלים פחות 1 הוא מספר הקודקודים הפנימיים (כולם עם דרגה 2) מקרה שני: דרגת השורש היא 2. מספר העלים ב T הוא סכום העלים בT1 וב T2 מספר הקודקודים עם דרגה 2 ב T הוא סכום הקודקודים עם דרגה 2 בT1 וב T2 ועוד קודקוד 1 (השורש) T1 T2 𝐷2 𝑇 = 𝐷2 𝑇1 + 𝐷2 𝑇2 + 1 = 𝐿 𝑇1 − 1 + 𝐿 𝑇2 − = 𝐿(𝑇) – 1 ע"פ הנחת האינדוקציה ע"פ 2 ע"פ 1 ds172-ps05

34 תרגיל 4 – מסלול מקסימלי T עץ בינארי עם n קודקודים. לכל קודקוד x יש את השדות הבאים: x.key – מספר טבעי x.left – מצביע לבן השמאלי x.right – מצביע לבן הימני x.val – מספר טבעי לשימוש כללי (אינו בשימוש בT במקור) נגדיר את maxSumPath(T) כסכום המקסימלי של מפתחות במסלול (פשוט) מהשורש לעלה כלשהו. נגדיר MaxPath(T) כמסלול כלשהו עם סכום זה. דוגמא: maxSumPath(T)=23 MaxPath(T) = left, left ds172-ps05

35 תרגיל 4 – מסלול מקסימלי T עץ בינארי עם n קודקודים. לכל קודקוד x יש את השדות הבאים: x.key – מספר טבעי x.left – מצביע לבן השמאלי x.right – מצביע לבן הימני x.val – מספר טבעי לשימוש כללי (אינו בשימוש בT במקור) נגדיר את maxSumPath(T) כסכום המקסימלי של מפתחות במסלול (פשוט) מהשורש לעלה כלשהו. נגדיר MaxPath(T) כמסלול כלשהו עם סכום זה. תארו אלגוריתם למציאת הערך maxSumPath(T) בזמן O(n) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? ds172-ps05

36 תרגיל 4 – מסלול מקסימלי תארו אלגוריתם למציאת הערך maxSumPath(T) בזמן O(n) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? פתרון: מחשבים רקורסיבית את maxSumPath של הבן השמאלי וכן את maxSumPath של הבן הימני, ומוסיפים את המפתח של הקודקוד למקסימלי מביניהם maxSumPath(T){ if (T == null) return 0 Lmax = maxSumPath(left-sub-tree(T)) Rmax = maxSumPath(right-sub-tree(T)) m = Max(Lmax,Rmax) return m+T.key } ds172-ps05

37 תרגיל 4 – מסלול מקסימלי תארו אלגוריתם למציאת הערך maxSumPath(T) בזמן O(n) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? פתרון: נחשב את maxSumPath כמו קודם, רק שנעדכן את x.val ל0 אם הסכום המקסימלי בא מתת-עץ השמאלי ו1 אם מהימני. בהדפסת המסלול נשתמש בערך x.val להחליט לאיזה כיוון להמשיך. maxSumPath(T) if (T == null) return 0 Lmax = maxSumPath(left-sub-tree(T)) Rmax = maxSumPath(right-sub-tree(T)) m = Max(Lmax,Rmax) if (m == Lmax) T.val = 0 else T.val = 1 return m+T.key ds172-ps05

38 23,L תרגיל 4 – מסלול מקסימלי 22,L 4 תארו אלגוריתם למציאת הערך maxSumPath(T) בזמן O(n) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? פתרון: נחשב את maxSumPath כמו קודם, רק שנעדכן את x.val ל0 אם הסכום המקסימלי בא מתת-עץ השמאלי ו1 אם מהימני. בהדפסת המסלול נשתמש בערך x.val להחליט לאיזה כיוון להמשיך. 15,L 20 3 maxSumPath(T) if (T == null) return 0 Lmax = maxSumPath(left-sub-tree(T)) Rmax = maxSumPath(right-sub-tree(T)) m = Max(Lmax,Rmax) if (m == Lmax) T.val = 0 else T.val = 1 return m+T.key ds172-ps05

39 תרגיל 4 – מסלול מקסימלי תארו אלגוריתם למציאת הערך maxSumPath(T) בזמן O(n) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? ניתוח זמן: מבקרים בכל קודקוד פעם אחת, לכן זמן הריצה O(n) מבקרים פעם אחת בכל קודקוד במסלול, ומספר הקודקודים במסלול חסום ע"י n. לכן סה"כ O(n) ds172-ps05

40 Binary Search Tree – עץ חיפוש בינארי
לכל קודקוד x בעץ חיפוש בינארי T : אם 𝑦 קודקוד הנמצא בתת העץ השמאלי של 𝑥 אז key(y)<key(x) אם 𝑦 קודקוד הנמצא בתת העץ הימני של 𝑥 אז key(y)≥key(x) תכונות של BST המפתח של הקודקוד השמאלי ביותר מפתח מינימלי המפתח של הקודקוד הימני ביותר מפתח מקסימלי ds172-ps05

41 Binary Search Tree – עץ חיפוש בינארי
Predecessor הקודם יהי xצומת בעץ בינארי T. הקודם של x הוא הצומת שקודם ל-x בטיול in-order על העץ T. אם ל-x קיים בן שמאלי, אזי הקודם הוא המקסימום בתת-עץ השמאלי של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן הימני שלו הוא גם אב קדמון של x או x בעצמו. Successor העוקב העוקב של x הוא הצומת שעוקב ל-x בטיול in-order על העץ T. אם ל-x קיים בן ימני, אזי העוקב הוא המינימום בתת-עץ הימני של x. אחרת, העוקב הוא האב הקדמון הנמוך ביותר של x, שהבן השמאלי שלו הוא גם אב קדמון של x או x בעצמו. ds172-ps05

42 Binary Search Tree – עץ חיפוש בינארי
Predecessor הקודם יהי xצומת בעץ בינארי T. הקודם של x הוא הצומת שקודם ל-x בטיול in-order על העץ T. אם ל-x קיים בן שמאלי הקודם הוא המקסימום בתת-עץ השמאלי של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן הימני שלו הוא גם אב קדמון של x. Successor העוקב העוקב של x הוא הצומת שעוקב ל-x בטיול in-order על העץ T. אם ל-x קיים בן ימני הקודם הוא המינימום בתת-עץ הימני של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן השמאלי שלו הוא גם אב קדמון של x. מי הקודם של 6? יש לו בן שמאלי והמקסימום הוא 4 ds172-ps05

43 Binary Search Tree – עץ חיפוש בינארי
Predecessor הקודם יהי xצומת בעץ בינארי T. הקודם של x הוא הצומת שקודם ל-x בטיול in-order על העץ T. אם ל-x קיים בן שמאלי הקודם הוא המקסימום בתת-עץ השמאלי של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן הימני שלו הוא גם אב קדמון של x. Successor העוקב העוקב של x הוא הצומת שעוקב ל-x בטיול in-order על העץ T. אם ל-x קיים בן ימני הקודם הוא המינימום בתת-עץ הימני של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן השמאלי שלו הוא גם אב קדמון של x. מי הקודם של 4? אין לו בן שמאלי. האב הקדמון הראשון שבנו הימני גם אב קדמון ds172-ps05

44 Binary Search Tree – עץ חיפוש בינארי
מי העוקב של 6? Predecessor הקודם יהי xצומת בעץ בינארי T. הקודם של x הוא הצומת שקודם ל-x בטיול in-order על העץ T. אם ל-x קיים בן שמאלי הקודם הוא המקסימום בתת-עץ השמאלי של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן הימני שלו הוא גם אב קדמון של x. Successor העוקב העוקב של x הוא הצומת שעוקב ל-x בטיול in-order על העץ T. אם ל-x קיים בן ימני הקודם הוא המינימום בתת-עץ הימני של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן השמאלי שלו הוא גם אב קדמון של x. יש לו בן ימני והמינימום הוא 7 ds172-ps05

45 Binary Search Tree – עץ חיפוש בינארי
מי העוקב של 7? Predecessor הקודם יהי xצומת בעץ בינארי T. הקודם של x הוא הצומת שקודם ל-x בטיול in-order על העץ T. אם ל-x קיים בן שמאלי הקודם הוא המקסימום בתת-עץ השמאלי של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן הימני שלו הוא גם אב קדמון של x. Successor העוקב העוקב של x הוא הצומת שעוקב ל-x בטיול in-order על העץ T. אם ל-x קיים בן ימני הקודם הוא המינימום בתת-עץ הימני של x. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של x, שהבן השמאלי שלו הוא גם אב קדמון של x. אין לו בן ימני. האב הקדמון הראשון שבנו השמאלי הוא גם אב קדמון ds172-ps05

46 Binary Search Tree – עץ חיפוש בינארי
מחיקת קודקוד x מBST: x הוא עלה והוא בן שמאלי: x.parent.left → null x הוא עלה והוא בן ימני: x.parent.right → null ds162-ps05 24 נובמבר 18

47 Binary Search Tree – עץ חיפוש בינארי
מחיקת קודקוד x מBST: ל-x יש בן יחיד, y: עדכן את x.parent להצביע ל-y במקום ל-x, ואת y.parent להיות x.parent. ds162-ps05 24 נובמבר 18

48 Binary Search Tree – עץ חיפוש בינארי
מחיקת קודקוד x מBST: ל-x יש שני בנים: החלף את x עם העוקב שלו. לעוקב אין בן שמאלי, אך אם יש לו בן ימני בצע רקורסיבית מחיקה של העוקב (לפי המקרה הקודם). ds162-ps05 24 נובמבר 18

49 Binary Search Tree – עץ חיפוש בינארי
הדגמת מחיקות מעץ חיפוש בינארי: 15 20 8 3 12 23 13 10 11 ds172-ps05

50 Binary Search Tree – עץ חיפוש בינארי
הדגמת מחיקות מעץ חיפוש בינארי: 15 8 20 23 3 12 13 10 11 ds172-ps05

51 Binary Search Tree – עץ חיפוש בינארי
הדגמת מחיקות מעץ חיפוש בינארי: 20 8 20 23 3 12 13 10 11 ds172-ps05

52 Binary Search Tree – עץ חיפוש בינארי
הדגמת מחיקות מעץ חיפוש בינארי: 20 8 20 23 3 12 13 10 11 ds172-ps05

53 תרגיל 5 נתון BST T בגודל n, בו לכל קודקוד x יש שדה נוסף של x.size – מספר המפתחות (גודל) של תת-העץ של x (כולל x עצמו) הציעו אלגוריתם בזמן O(h) (כאשר h גובה העץ) למימוש Greater(T,k) – מציאת מספר המפתחות שממש גדולים מk מה מרמז לנו 𝑂 ℎ ? ds172-ps05

54 תרגיל 5 נתון BST T בגודל n, בו לכל קודקוד x יש שדה נוסף של x.size – מספר המפתחות (גודל) של תת-העץ של x (כולל x עצמו) הציעו אלגוריתם בזמן O(h) (כאשר h גובה העץ) למימוש Greater(T,k) – מציאת מספר המפתחות שממש גדולים מk הדגמה: key=20 size= 15 key=15 size= 36 key=8 size= 20 key=10 size= 8 key=4 size= 11 k = 10 key=12 size= 4 ds172-ps05

55 תרגיל 5 נתון BST T בגודל n, בו לכל קודקוד x יש שדה נוסף של x.size – מספר המפתחות (גודל) של תת-העץ של x (כולל x עצמו) הציעו אלגוריתם בזמן O(h) (כאשר h גובה העץ) למימוש Greater(T,k) – מציאת מספר המפתחות שממש גדולים מk הדגמה: key=20 size= 15 key=15 size= 36 key=8 size= 20 key=10 size= 8 key=4 size= 11 k = 10 key=12 size= 4 הקודקוד Greater(T,k)=15+1+4=20 כל תת-העץ כל תת-העץ ds172-ps05

56 תרגיל 5 נתון BST T בגודל n, בו לכל קודקוד x יש שדה נוסף של x.size – מספר המפתחות (גודל) של תת-העץ של x (כולל x עצמו) הציעו אלגוריתם בזמן O(h) (כאשר h גובה העץ) למימוש Greater(T,k) – מציאת מספר המפתחות שממש גדולים מk פתרון: זמן ריצה: O(h) הערה: ℎ=𝑂(𝑛) במקרה הגרוע ביותר, ו- 𝑂( log 𝑛 ) במקרה הטוב ds172-ps05

57 תרגיל 6 נתונים שני עצי חיפוש בינאריים T1 וT2 עם גבהים h1 וh2 בהתאמה (h1 וh2 נתונים). נתון בנוסף שכל הערכים בT1 קטנים ממש מכל הערכים בT2. הניחו שכל ערכי המפתחות שונים. כיצד ניתן לאחד את שני העצים לעץ אחד המכיל את איחוד הערכים בזמן O(min(h1,h2))? מה יהיה גובה עץ האיחוד? א - O(h1 + h2) ג - O( min(h1,h2) ) ב - O( max(h1,h2) + | h1 - h2 |) ד - O( max(h1,h2) ) T1 T2 ds172-ps05

58 תרגיל 6 כיצד ניתן לאחד את שני העצים לעץ אחד המכיל את איחוד הערכים בזמן O(min(h1,h2))? פתרון: case a: h1 ≤ h2 Extract from T1 the element v with the maximum key in T1 in O(h1) time. v.left ← T1 v.right ← T2 v is the root of the new merged tree. T1 T2 max(T1) ds172-ps05

59 תרגיל 6 כיצד ניתן לאחד את שני העצים לעץ אחד המכיל את איחוד הערכים בזמן O(min(h1,h2))? פתרון: case a: h1 ≤ h2 Extract from T1 the element v with the maximum key in T1 in O(h1) time. v.left ← T1 v.right ← T2 v is the root of the new merged tree. case b: h1 > h2 Extract from T2 the element v with the minimum key in T2 in O(h2) time. T1 T2 min(T2) ds172-ps05

60 תרגיל 6 מה יהיה גובה עץ האיחוד? פתרון: max(h1,h2)+1 ds172-ps05

61 תרגיל 7 מצאו אלגוריתם הבודק אם עץ בינארי נתון T הוא BST.
הניחו שכל הערכים הינם מספרים שלמים שונים זה מזה הניחו שלכל קודקוד יש מצביע לשני הילדים אך לא מצביע להורה. פתרון (שגוי): נבדוק בכל קודקוד בצורה רקורסיבית שערך הבן השמאלי קטן יותר מהערך הנוכחי וערך הבן הימני גדול יותר מהערך הנוכחי. פתרון זה אינו מספיק – מצאו דוגמא נגדית ds172-ps05

62 תרגיל 7 פתרון (שגוי): נבדוק בכל קודקוד בצורה רקורסיבית שערך הבן השמאלי קטן יותר מהערך הנוכחי וערך הבן הימני גדול יותר מהערך הנוכחי. פתרון זה אינו מספיק – מצאו דוגמא נגדית 15 8 20 ds172-ps05

63 תרגיל 7 פתרון (מתוקן): נשתמש בפונקציית עזר ששומרת את הגבולות העליונים והתחתונים של הערכים המורשים בתת-העץ −∞ 15 −∞ 15 8 8 15 20 ds172-ps05

64 תרגיל 7 פתרון (מתוקן): נשתמש בפונקציית עזר ששומרת את הגבולות העליונים והתחתונים של הערכים המורשים בתת-העץ −∞ 15 −∞ 15 8 8 15 20 ds172-ps05

65 תרגיל 7 פתרון (מתוקן): נשתמש בפונקציית עזר ששומרת את הגבולות העליונים והתחתונים של הערכים המורשים בתת-העץ −∞ 15 −∞ 15 15 8 20 8 15 20 10 30 ds172-ps05

66 תרגיל 7 פתרון (מתוקן): נשתמש בפונקציית עזר ששומרת את הגבולות העליונים והתחתונים של הערכים המורשים בתת-העץ boolean isValid(Node root) { return isValidHelper(root, Integer.MIN_VALUE, Integer.MAX_VALUE) } boolean isValidHelper(Node curr, int min, int max) { if(curr.value < min || curr.value > max) return false if (curr.left != null && !isValidHelper(curr.left, min, curr.value)) if (curr.right != null && !isValidHelper(curr.right, curr.value, max)) return true } זמן הריצה הינו O(n). פתרון אפשרי נוסף הוא ביצוע הליכת Inorder ובדיקה שהיא ממוינת בסדר עולה. זמן ריצה O(n). ds172-ps05

67 מה היה לנו היום? דיברנו על עצים. ראינו למה מבנה נתונים של עץ טוב לנו.
התידדנו עם עץ חיפוש בינארי. ראינו שימושים שונים וחוקים שונים לעצים אלו. ds172-ps05

68 בהמשך מה הבעיה עם BST? איך נתמודד עם זה? ds162-ps05 24 נובמבר 18


Download ppt "Trees, BSTs- עצים ועצי חיפוש בינאריים"

Similar presentations


Ads by Google