מבני נתונים ואלגוריתמים - מחברת קורס/מבני נתונים/עצי חיפוש בינריים: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Atavory (שיחה | תרומות)
Atavory (שיחה | תרומות)
שורה 275:
 
 
==פעולות למעבר על כל איברי העץ==
===פעולת הsplice===
 
 
לעתים רוצים לעבור על כל איברי העץ, אם כדי להדפיסם, ואם למטרה אחרת. נראה כעת שלוש שיטות (רקורסיביות) מקובלות למעבר על כל איברי העץ, ונשתמש בהדפסה כדוגמה. בשיעורי הבית תתבקש להראות שכל אחד מזמני הריצה של המעברים הוא לינארי במספר האיברים בעץ.
נניח שלצומת אין בנים, או שלצומת יש רק בן יחיד. כדי להוציא את הצומת מהעץ, פשוט מחברים את אביו (אם יש לו כזה) עם בנו (אם יש לו כזה).
 
===מעבר Pre-Order===
 
בצורת מעבר זו, כאשר מגיעים לצומת:
{{דוגמה|תוכן =
#ראשית מדפיסים את (איבר) הצומת עצמו
התרשים הבא מראה כיצד להוציא את הצומת בעל המפתח 7:
#לאחר מכן עוברים על תת העץ הימני שלו
#לאחר מכן עוברים על תת-העץ השמאלי שלו
 
<source lang = "python">
Pre-Order(nd)
51 if parentnd == Nil
72 return
 
3 Print(nd.value)
[[תמונה:dsa_binary_search_splice.png|מרכז|100%|splice בעץ חיפוש בינרי.]]}}
 
4 Pre-Order(nd.l-child)
5 Pre-order(nd.r-child)
</source>
 
התרשים הבא מראה את סדר המעבר בצומת:
הפסוודו-קוד הבא מממש זאת. (רובו מטפל במקרי קצה מעצבנים, כגון המקרה שבו הצומת המוצא הוא השורש.)
 
[[תמונה:dsa_binary_search_tree_pre_order.png|מרכז|100%|מעבר pre-order.]]
 
 
===מעבר Post-Order===
 
בצורת מעבר זו, כאשר מגיעים לצומת:
#ראשית עוברים על תת-העץ השמאלי שלו
#לאחר מכן עוברים על תת העץ הימני שלו
#לאחר מכן מדפיסים את (איבר) הצומת עצמו
 
 
<source lang = "python">
Post-Order(nd)
# Splices (removes) a node (nd) from a tree (t).
31 if childnd !== Nil
# The node (nd) must not have two children.
2 return
Splice(t, nd)
1 child = nd.l_child == Nil ? nd.r-child : nd.l-child
 
4 Post-Order(nd.l-child)
2 parent = nd.parent
5 Post-order(nd.r-child)
 
3 Print(nd.value)
3 if child != Nil
</source>
4 child.parent = parent
 
התרשים הבא מראה את סדר המעבר בצומת:
5 if parent == Nil
 
6 t.root = child
[[תמונה:dsa_binary_search_tree_post_order.png|מרכז|100%|מעבר post-order.]]
7 return
 
 
8 if nd.key < parent.key
===מעבר In-Order===
9 parent.l-child = child
 
10 else
בצורת מעבר זו, כאשר מגיעים לצומת:
11 parent.r-child = child
#ראשית עוברים על תת-העץ השמאלי שלו
#לאחר מכן מדפיסים את (איבר) הצומת עצמו
#לאחר מכן עוברים על תת העץ הימני שלו
 
 
<source lang = "python">
In-Order(nd)
1 if nd == Nil
2 return
 
3 In-Order(nd.l-child)
 
4 Print(nd.value)
 
5 In-order(nd.r-child)
</source>
 
התרשים הבא מראה את סדר המעבר בצומת:
 
[[תמונה:dsa_binary_search_tree_in_order.png|מרכז|100%|מעבר in-order.]]
 
בשיעורי הבית תתבקש להוכיח שצורת מעבר זו תדפיס את כל איברי העץ בסדר עולה.
 
===האלגוריתם===