Download presentation
Presentation is loading. Please wait.
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
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.