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

Slides:



Advertisements
מצגות קשורות
ילדי גן "יסמין" וגן פרפר נחמד" נוטעים יחד עם חיילי סמ"ג חוף
Advertisements

כרטיסי מידע להכרת הציפורים שבקרבת משכנות האדם
الاشكال الهندسية צורות הנדסיות
עמל שפרעם-מודל להתמודדות עם תלמידים תת משיגים
وظائف الفجوة الخلوية وظائف الفجوة المحافظة علي استمرارية ضغط الامتلاء Turger pressure للخلية وهو هام جدا للتركيب الدعامي وللتحكم في حركة الماء.
מגמת ניהול עסקי "קציר".
מיפוי הנשים הפלסטיניות הכותבות אחרי 1948
תמליל מצגת:

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

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

מה יהיה לנו היום? נזכיר מהו עץ. דוגמאות לשימוש בעצים. 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

תרגיל 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 + 1 = 𝐿(𝑇) – 1 ע"פ הנחת האינדוקציה ע"פ 2 ע"פ 1 ds192-ps05

תרגיל 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 + 1 = 𝐿(𝑇) – 1 ע"פ הנחת האינדוקציה ע"פ 2 ע"פ 1 ds192-ps05

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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