המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

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

מצגות קשורות


מצגת בנושא: "Trees, BSTs- עצים ועצי חיפוש בינאריים"— תמליל מצגת:

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

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

3 מה יהיה לנו היום? נזכיר מהו עץ. דוגמאות לשימוש בעצים.
How do trees access their memories? They log o(n). נזכיר מהו עץ. דוגמאות לשימוש בעצים. עץ חיפוש בינארי BST. חוקים ודוגמאות לשימוש בBST. Sometimes it feels like all the people I know are logs. Aren’t you upside down? You imagine things. Your root’s in the sky. ds192-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. ds192-ps05

5 Tree – עץ – הגדרות פונ' נוספות הנדרשות במבנה הנתונים: depth(node v)
הגדרה שקולה: עומק של צומת v הוא אורך המסלול (בקשתות) משורש אל v. depth(root) = 0 depth(v ≠ root) = depth(v.parent) + 1 1 2 3 ds192-ps05

6 Tree – עץ – הגדרות פונ' נוספות הנדרשות במבנה הנתונים: height(node 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() גובה של עץ הוא הגובה של השורש 3 2 1 ds192-ps05

7 Binary Tree – עץ בינארי – הגדרה
לכל קודקוד יש לכל היותר 2 בנים, בן שמאלי ובן ימני. ds192-ps05

8 Binary Tree – עץ בינארי – הגדרה
עץ בינארי מלא (full) – עץ אשר לכל קודקוד יש בדיוק 0 או 2 ילדים. הערה: עץ בינארי מלא עם L עלים מכיל L−1 קודקודים פנימיים. (הוכחה בהמשך) ds192-ps05

9 Binary Tree – עץ בינארי – הגדרה
עץ בינארי מושלם (perfect) – עץ בינארי שגובהו ℎ ומתקיים: עץ בינארי מלא כל העלים הם מאותה רמה. ds192-ps05

10 Binary Tree – עץ בינארי – הגדרה
עץ בינארי שלם (complete) – עץ בינארי שגובהו ℎ ומתקיים: לכל הקודקודים שלו עד שכבה ℎ−2 יש בדיוק 2 בנים. כל הקודקודים ברמה ה- ℎ מרוכזים לשמאל. ℎ−2 ds192-ps05

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

12 סריקות בעץ בינארי 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 ds192-ps05

13 סריקות בעץ בינארי 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 ds192-ps05

14 סריקות בעץ בינארי 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 ds192-ps05

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

16 k-Tree עוד דוגמא לייצוג ds192-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. לפי Preorder נדע מהו השורש של העץ ולפי Inorder נדע מהם האיברים משמאל לשורש ומהם האיברים מימין לשורש. ds192-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. לפני השורש – תת-עץ שמאלי אחרי השורש – תת-עץ ימני שורש העץ ds192-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. לתת-עץ b,c,d אנחנו יודעים את הסריקות Preorder וInorder כיוון שהן הסריקות המושרות מT: Preorder: b,c,d. Inorder: c,d,b. ds192-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. לתת-עץ b,c,d אנחנו יודעים את הסריקות Preorder וInorder כיוון שהן הסריקות המושרות מT: Preorder: b,c,d. Inorder: c,d,b. ds192-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. לתת-עץ b,c,d אנחנו יודעים את הסריקות Preorder וInorder כיוון שהן הסריקות המושרות מT: Preorder: b,c,d. Inorder: c,d,b. ds192-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. לתת-עץ c,d אנחנו יודעים את הסריקות Preorder וInorder כיוון שהן הסריקות המושרות מT: Preorder: c,d. Inorder: c,d. ds192-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. לתת-עץ c,d אנחנו יודעים את הסריקות Preorder וInorder כיוון שהן הסריקות המושרות מT: Preorder: c,d. Inorder: c,d. ds192-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: e,g,h,j,f. Inorder: h,g,j,e,f. ds192-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. Preorder: e,g,h,j,f. Inorder: h,g,j,e,f. ds192-ps05

26 תרגיל 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. ds192-ps05

27 תרגיל 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. ds192-ps05

28 תרגיל 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, ניתן לשחזר את העץ. אחת הדרכים להוכיח טענה זו היא ע"י שימוש באינדוקציה. ds192-ps05

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

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

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

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

33 תרגיל 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 ds192-ps05

34 תרגיל 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 ds192-ps05

35 תרגיל 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 ds192-ps05

36 תרגיל 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 ds192-ps05

37 תרגיל 4 – מסלול מקסימלי 𝑇 עץ בינארי עם 𝑛 קודקודים. לכל קודקוד 𝑥 יש את השדות הבאים: 𝑥.𝑘𝑒𝑦 – מספר טבעי 𝑥.𝑙𝑒𝑓𝑡 – מצביע לבן השמאלי 𝑥.𝑟𝑖𝑔ℎ𝑡 – מצביע לבן הימני 𝑥.𝑣𝑎𝑙 – מספר טבעי לשימוש כללי (אינו בשימוש ב𝑇 במקור) - 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ(𝑇) הסכום המקסימלי של מפתחות במסלול (פשוט) מהשורש לעלה כלשהו. 𝑀𝑎𝑥𝑃𝑎𝑡ℎ(𝑇) - מסלול כלשהו עם סכום זה. דוגמא: 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ(𝑇)=23 𝑀𝑎𝑥𝑃𝑎𝑡ℎ(𝑇) = 𝑙𝑒𝑓𝑡, 𝑙𝑒𝑓𝑡 ds192-ps05

38 תרגיל 4 – מסלול מקסימלי 𝑇 עץ בינארי עם 𝑛 קודקודים. לכל קודקוד 𝑥 יש את השדות הבאים: 𝑥.𝑘𝑒𝑦 – מספר טבעי 𝑥.𝑙𝑒𝑓𝑡 – מצביע לבן השמאלי 𝑥.𝑟𝑖𝑔ℎ𝑡 – מצביע לבן הימני 𝑥.𝑣𝑎𝑙 – מספר טבעי לשימוש כללי (אינו בשימוש ב𝑇 במקור) - 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ(𝑇) הסכום המקסימלי של מפתחות במסלול (פשוט) מהשורש לעלה כלשהו. 𝑀𝑎𝑥𝑃𝑎𝑡ℎ(𝑇) - מסלול כלשהו עם סכום זה. תארו אלגוריתם למציאת הערך 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ(𝑇) בזמן 𝑂(𝑛) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? ds192-ps05

39 תרגיל 4 – מסלול מקסימלי maxSumPath(T){ if (T == null) return 0
תארו אלגוריתם למציאת הערך 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ(𝑇) בזמן 𝑂(𝑛) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? פתרון: מחשבים רקורסיבית את 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ של הבן השמאלי וכן את 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ של הבן הימני, ומוסיפים את המפתח של הקודקוד למקסימלי מביניהם 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 } ds192-ps05

40 תרגיל 4 – מסלול מקסימלי תארו אלגוריתם למציאת הערך𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ(𝑇) בזמן 𝑂(𝑛) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? פתרון: נחשב את 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ כמו קודם, רק שנעדכן את 𝑥.𝑣𝑎𝑙 ל-0 אם הסכום המקסימלי בא מתת-עץ השמאלי ו-1 אם מהימני. בהדפסת המסלול נשתמש בערך 𝑥.𝑣𝑎𝑙 להחליט לאיזה כיוון להמשיך. 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 ds192-ps05

41 23,L תרגיל 4 – מסלול מקסימלי 22,L 4 תארו אלגוריתם למציאת הערך𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ(𝑇) בזמן 𝑂(𝑛) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? פתרון: נחשב את 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ כמו קודם, רק שנעדכן את 𝑥.𝑣𝑎𝑙 ל-0 אם הסכום המקסימלי בא מתת-עץ השמאלי ו-1 אם מהימני. בהדפסת המסלול נשתמש בערך 𝑥.𝑣𝑎𝑙 להחליט לאיזה כיוון להמשיך. 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 ds192-ps05

42 תרגיל 4 – מסלול מקסימלי תארו אלגוריתם למציאת הערך 𝑚𝑎𝑥𝑆𝑢𝑚𝑃𝑎𝑡ℎ(𝑇) בזמן 𝑂(𝑛) כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול המקסימלי? ניתוח זמן: מבקרים בכל קודקוד פעם אחת, לכן זמן הריצה 𝑂(𝑛) מבקרים פעם אחת בכל קודקוד במסלול, ומספר הקודקודים במסלול חסום ע"י − ℎ גובה העץ. לכן סה"כ 𝑂(ℎ) . שימו לב: גובה העץ, h, חסום ע"י 𝑂(𝑛). ds192-ps05

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

44 Binary Search Tree – עץ חיפוש בינארי
Predecessor הקודם יהי 𝑥צומת בעץ בינארי 𝑇. הקודם של 𝑥 הוא הצומת שקודם ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן שמאלי - הקודם הוא המקסימום בתת-עץ השמאלי של 𝑥. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן הימני שלו הוא גם אב קדמון של 𝑥. (a) (b) אבל אולי הוא חלק מתת-עץ ימני x x Inorder: 1,3,4,6,7,8,10,13,14 כל האיברים הקטנים מ-x אין פה איברים קטנים מ-x ds192-ps05

45 Binary Search Tree – עץ חיפוש בינארי
Successor העוקב יהי 𝑥צומת בעץ בינארי 𝑇. העוקב של 𝑥 הוא הצומת שעוקב ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן ימני העוקב הוא המינימום בתת-עץ הימני של 𝑥. אחרת, העוקב הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן השמאלי שלו הוא גם אב קדמון של 𝑥. (a) (b) אבל אולי הוא חלק מתת-עץ שמאלי x x Inorder: 1,3,4,6,7,8,10,13,14 כל האיברים הגדולים מ-x אין פה איברים גדולים מ-x 45 ds192-ps05 ds172-ps05

46 Binary Search Tree – עץ חיפוש בינארי
Predecessor הקודם יהי 𝑥צומת בעץ בינארי 𝑇. הקודם של 𝑥 הוא הצומת שקודם ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן שמאלי - הקודם הוא המקסימום בתת-עץ השמאלי של 𝑥. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן הימני שלו הוא גם אב קדמון של 𝑥. Successor העוקב העוקב של 𝑥 הוא הצומת שעוקב ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן ימני הקודם הוא המינימום בתת-עץ הימני של 𝑥. אחרת, העוקב הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן השמאלי שלו הוא גם אב קדמון של 𝑥. מי הקודם של 6? יש לו בן שמאלי והמקסימום הוא 4 Inorder: 1,3,4,6,7,8,10,13,14 ds192-ps05

47 Binary Search Tree – עץ חיפוש בינארי
Predecessor הקודם יהי 𝑥צומת בעץ בינארי 𝑇. הקודם של 𝑥 הוא הצומת שקודם ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן שמאלי - הקודם הוא המקסימום בתת-עץ השמאלי של 𝑥. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן הימני שלו הוא גם אב קדמון של 𝑥. Successor העוקב העוקב של 𝑥 הוא הצומת שעוקב ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן ימני הקודם הוא המינימום בתת-עץ הימני של 𝑥. אחרת, העוקב הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן השמאלי שלו הוא גם אב קדמון של 𝑥. מי הקודם של 4? אין לו בן שמאלי. האב הקדמון הראשון שבנו הימני גם אב קדמון Inorder: 1,3,4,6,7,8,10,13,14 ds192-ps05

48 Binary Search Tree – עץ חיפוש בינארי
מי העוקב של 6? Predecessor הקודם יהי 𝑥צומת בעץ בינארי 𝑇. הקודם של 𝑥 הוא הצומת שקודם ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן שמאלי - הקודם הוא המקסימום בתת-עץ השמאלי של 𝑥. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן הימני שלו הוא גם אב קדמון של 𝑥. Successor העוקב העוקב של 𝑥 הוא הצומת שעוקב ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן ימני הקודם הוא המינימום בתת-עץ הימני של 𝑥. אחרת, העוקב הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן השמאלי שלו הוא גם אב קדמון של 𝑥. יש לו בן ימני והמינימום הוא 7 Inorder: 1,3,4,6,7,8,10,13,14 ds192-ps05

49 Binary Search Tree – עץ חיפוש בינארי
מי העוקב של 7? Predecessor הקודם יהי 𝑥צומת בעץ בינארי 𝑇. הקודם של 𝑥 הוא הצומת שקודם ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן שמאלי - הקודם הוא המקסימום בתת-עץ השמאלי של 𝑥. אחרת, הקודם הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן הימני שלו הוא גם אב קדמון של 𝑥. Successor העוקב העוקב של 𝑥 הוא הצומת שעוקב ל-𝑥 בטיול in-order על העץ 𝑇. אם ל-𝑥 קיים בן ימני הקודם הוא המינימום בתת-עץ הימני של 𝑥. אחרת, העוקב הוא האב הקדמון הנמוך ביותר של 𝑥, שהבן השמאלי שלו הוא גם אב קדמון של 𝑥. אין לו בן ימני. האב הקדמון הראשון שבנו השמאלי הוא גם אב קדמון Inorder: 1,3,4,6,7,8,10,13,14 ds192-ps05

50 Binary Search Tree – עץ חיפוש בינארי
מחיקת קודקוד 𝑥 מBST: 𝑥 הוא עלה והוא בן שמאלי: 𝑥.𝑝𝑎𝑟𝑒𝑛𝑡.𝑙𝑒𝑓𝑡 → 𝑛𝑢𝑙𝑙 𝑥 הוא עלה והוא בן ימני: 𝑥.𝑝𝑎𝑟𝑒𝑛𝑡.𝑟𝑖𝑔ℎ𝑡 → 𝑛𝑢𝑙𝑙 ds192-ps05

51 Binary Search Tree – עץ חיפוש בינארי
מחיקת קודקוד 𝑥 מBST: ל-𝑥 יש בן יחיד, 𝑦: עדכן את 𝑥.𝑝𝑎𝑟𝑒𝑛𝑡 להצביע ל-𝑦 במקום ל-𝑥, ואת 𝑦.𝑝𝑎𝑟𝑒𝑛𝑡 להיות 𝑥.𝑝𝑎𝑟𝑒𝑛𝑡. 𝑥.𝑝𝑎𝑟𝑒𝑛𝑡 𝑥 𝑦 ds192-ps05

52 Binary Search Tree – עץ חיפוש בינארי
מחיקת קודקוד 𝑥 מBST: ל-𝑥 יש שני בנים: החלף את 𝑥 עם העוקב שלו. לעוקב אין בן שמאלי, אך אם יש לו בן ימני בצע רקורסיבית מחיקה של העוקב (לפי המקרה הקודם). למה? העוקב של קודקוד x הוא האיבר שנבקר מיד אחרי x במעבר inorder. נסתכל על x, קודקוד בעץ בעל בן ימני. בשלב בו מגיעים ל-x במהלך מעבר ה-inorder על העץ - מבקרים ב- x, והיות שיש ל-x בן ימני עוברים בשלב הבא על תת העץ של בנו הימני. לכן העוקב של x הוא האיבר הראשון שנבקר בתת עץ ימני זה. לקודקוד הראשון שמבקרים במעבר inorder אין בן שמאלי, כי אחרת היינו מבקרים בתת העץ של בנו השמאלי לפניו. לכן לעוקב של x, שהוא הראשון במעבר inorder על תת העץ של בנו הימני, אין בן שמאלי. 𝑥 ds192-ps05

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

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

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

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

57 תרגיל 5 נתון עץ 𝑇, 𝐵𝑆𝑇 בגודל 𝑛. לכל קודקוד 𝑥 יש שדה נוסף 𝑥.𝑠𝑖𝑧𝑒 – מספר המפתחות של תת-העץ של 𝑥 (כולל 𝑥 עצמו) הציעו אלגוריתם ב- 𝑂(ℎ) למציאת מספר המפתחות שגדולים ממש מ-𝑘 𝐺𝑟𝑒𝑎𝑡𝑒𝑟(𝑇,𝑘) – מציאת מספר המפתחות שממש גדולים מ-𝑘 מה מרמז לנו 𝑂 ℎ ? ds192-ps05

58 תרגיל 5 k = 10 נתון עץ 𝑇, 𝐵𝑆𝑇 בגודל 𝑛.
לכל קודקוד 𝑥 יש שדה נוסף 𝑥.𝑠𝑖𝑧𝑒 – מספר המפתחות של תת-העץ של 𝑥 (כולל 𝑥 עצמו) הציעו אלגוריתם ב- 𝑂(ℎ) למציאת מספר המפתחות שגדולים ממש מ-𝑘 הדגמה: 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 ds192-ps05

59 תרגיל 5 k = 10 Greater(T,k)=15+1+4=20
נתון עץ 𝑇, 𝐵𝑆𝑇 בגודל 𝑛. לכל קודקוד 𝑥 יש שדה נוסף 𝑥.𝑠𝑖𝑧𝑒 – מספר המפתחות של תת-העץ של 𝑥 (כולל 𝑥 עצמו) הציעו אלגוריתם ב- 𝑂(ℎ) למציאת מספר המפתחות שגדולים ממש מ-𝑘 הדגמה: 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 ds192-ps05

60 תרגיל 5 נתון עץ 𝑇, 𝐵𝑆𝑇 בגודל 𝑛.
לכל קודקוד 𝑥 יש שדה נוסף 𝑥.𝑠𝑖𝑧𝑒 – מספר המפתחות של תת-העץ של 𝑥 (כולל 𝑥 עצמו) הציעו אלגוריתם ב- 𝑂(ℎ) למציאת מספר המפתחות שגדולים ממש מ-𝑘 הערה: ℎ=𝑂(𝑛) במקרה הגרוע ביותר, ו- 𝑂( log 𝑛 ) במקרה הטוב ds192-ps05

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

62 תרגיל 6 כיצד ניתן לאחד את שני העצים לעץ אחד המכיל את איחוד הערכים בזמן 𝑂(min⁡(ℎ1,ℎ2))? פתרון: 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. 𝑇1 𝑇2 max(T1) ds192-ps05

63 תרגיל 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) ds192-ps05

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

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

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

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

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

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

70 תרגיל 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 } זמן הריצה הינו 𝑂(𝑛). פתרון אפשרי נוסף הוא ביצוע הליכת Inorder ובדיקה שהיא ממוינת בסדר עולה. זמן ריצה 𝑂(𝑛). ds192-ps05

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

72 בהמשך מה הבעיה עם BST? איך נתמודד עם זה? ds192-ps05


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

מצגות קשורות


מודעות Google