Menu
Coddy logo textTech

Binary Tree (עץ בינארי)

עודכן לאחרונה

עץ בינארי הוא היררכיה שבה לכל צומת יש לכל היותר שני ילדים, שנקראים הבן השמאלי והבן הימני. הצומת העליון הוא השורש, צמתים בלי ילדים הם עלים, ומספר הקשתות מהשורש ועד העלה העמוק ביותר הוא גובה העץ. בניגוד לעץ חיפוש בינארי, לעץ בינארי רגיל אין כלל סדר: זו רק הצורה. לחצו על הפעלה למעלה כדי לראות עץ מתמלא רמה אחר רמה, ואז עובר מעבר in-order (שמאל, צומת, ימין).

עצים בינאריים הם הבסיס למבנים רבים: עצי חיפוש בינאריים, ערימות, עצי ביטויים ועוד. מעברים מבקרים בכל צומת בסדר מוגדר: in-order, pre-order ו-post-order הם שלושת המעברים לעומק, וכל אחד מהם שימושי למשימות אחרות.

מונחים

מונחמשמעות
שורשהצומת העליון, שאין לו הורה
עלהצומת בלי ילדים
גובההמסלול הארוך ביותר משורש לעלה (בקשתות)
עומקהמרחק של צומת מהשורש
שלםכל הרמות מלאות, חוץ אולי מהאחרונה, שמתמלאת משמאל לימין

שלושת המעברים לעומק

מעברסדרשימוש נפוץ
In-orderשמאל, צומת, ימיןפלט ממוין של BST
Pre-orderצומת, שמאל, ימיןהעתקה או סריאליזציה של עץ
Post-orderשמאל, ימין, צומתמחיקה או חישוב של עץ

דוגמה מפורטת

מעבר in-order על העץ שנבנה מ-[4, 2, 6, 1, 3, 5] (מתמלא רמה אחר רמה):

צעדבצומתפעולה
14נכנסים ברקורסיה לתת העץ השמאלי של 4 לפני הביקור בו
22נכנסים ברקורסיה לתת העץ השמאלי של 2 לפני הביקור בו
31עלה, אין בן שמאלי: מבקרים ב-1, הפלט [1]
42השמאל הסתיים: מבקרים ב-2, הפלט [1, 2], ואז נכנסים ברקורסיה ימינה
53עלה: מבקרים ב-3, הפלט [1, 2, 3]
64תת העץ השמאלי הסתיים: מבקרים ב-4, הפלט [1, 2, 3, 4], ואז נכנסים ברקורסיה ימינה
75הבן השמאלי של 6, עלה: מבקרים ב-5, הפלט [1, 2, 3, 4, 5]
86השמאל הסתיים, אין בן ימני: מבקרים ב-6, הפלט [1, 2, 3, 4, 5, 6]

מתי להשתמש בעץ בינארי

השתמשו בו כאשרהימנעו ממנו כאשר
אתם צריכים לייצג נתונים היררכיים מטבעם (מערכות קבצים, עצי ביטויים, DOM)הנתונים שטוחים ורשימה או מערך יספיקו: עץ רק מוסיף תקורה
אתם רוצים פעולות מסודרות ויכולים לשמור על איזון (BST או עץ שמאזן את עצמו)אתם צריכים חיפוש לפי מפתח של O(1) בממוצע: טבלת גיבוב מנצחת כל עץ
אתם צריכים עיבוד in-order, pre-order או post-order של נתונים מובניםצמתים מוכנסים בסדר ממוין ל-BST לא מאוזן: הוא מידרדר לרשימה של O(n)
שאילתות טווח או מעבר מסודר חשובים, ואת זה טבלאות גיבוב לא יכולות לספקהזיכרון מוגבל: כל צומת נושא שני מצביעים לילדים בנוסף לנתונים

קוד Binary Tree

מימוש נקי של Binary Tree שאפשר להריץ, ב-Python, JavaScript, Java, C++, C. בחרו שפה, העתיקו את הקוד, או פתחו אותו טעון מראש בעורך האונליין של Coddy.

קוד Binary Tree ב-Python

Python
1from collections import deque2
3
4class Node:5    def __init__(self, value):6        self.value = value7        self.left = None8        self.right = None9
10
11def insert(root, value):12    # Level-order insert: fill the first empty child slot found13    if root is None:14        return Node(value)15    queue = deque([root])16    while queue:17        node = queue.popleft()18        if node.left is None:19            node.left = Node(value)20            return root21        queue.append(node.left)22        if node.right is None:23            node.right = Node(value)24            return root25        queue.append(node.right)26
27
28def inorder(node):29    if node is None:30        return []31    return inorder(node.left) + [node.value] + inorder(node.right)32
33
34root = None35for value in [1, 2, 3, 4, 5, 6, 7]:36    root = insert(root, value)37
38print("Root:   ", root.value)39print("Inorder:", inorder(root))
להריץ את הקוד הזה בעורך ה-Python אונליין

שאלות נפוצות על עץ בינארי

מה ההבדל בין עץ בינארי לעץ חיפוש בינארי?
עץ בינארי רק מגביל כל צומת לשני ילדים לכל היותר, בלי סדר. עץ חיפוש בינארי מוסיף את הכלל שכל מה שבתת העץ השמאלי קטן יותר וכל מה שבתת העץ הימני גדול יותר, וזה מה שהופך את החיפוש למהיר.
מהו מעבר in-order?
מעבר in-order מבקר בתת העץ השמאלי, אחר כך בצומת ואז בתת העץ הימני, באופן רקורסיבי. בעץ חיפוש בינארי הוא מחזיר את הערכים בסדר עולה, ולכן זה המעבר הנפוץ ביותר להדגמה.
מהו עץ בינארי שלם?
בעץ בינארי שלם כל הרמות מלאות לגמרי, חוץ אולי מהאחרונה, שמתמלאת משמאל לימין. הצורה הזו מאפשרת לשמור את העץ בצורה דחוסה במערך (בלי צורך במצביעים לילדים), וכך ממומשות ערימות בינאריות.
מתי כדאי להשתמש בעץ בינארי במקום במערך או בטבלת גיבוב?
בחרו בעץ כשהנתונים שלכם היררכיים מטבעם, או כשאתם צריכים פעולות מסודרות כמו שאילתות טווח ומעבר ממוין, שטבלאות גיבוב לא יכולות לתת. אם צריך רק חיפוש מהיר לפי מפתח בלי סדר, הגישה של O(1) בממוצע בטבלת גיבוב מנצחת עץ, ועבור נתונים שטוחים מערך פשוט יותר וידידותי יותר למטמון.
מה ההבדל בין הגובה לעומק של עץ בינארי?
עומק נמדד מהשורש כלפי מטה עד צומת מסוים: מספר הקשתות במסלול מהשורש לאותו צומת. גובה נמדד מצומת כלפי מטה עד העלה העמוק ביותר שלו, ולכן הגובה של העץ כולו הוא העומק של הצומת העמוק ביותר בו. לעץ עם צומת יחיד יש גובה 0, וגם העומק של הצומת היחיד שלו הוא 0.
למה עץ בינארי לא מאוזן מתפקד כל כך גרוע?
חיפוש, הכנסה ומחיקה בעץ חיפוש בינארי עולים O(h), כאשר h הוא הגובה. כשמפתחות מוכנסים בסדר ממוין העץ הופך לקו ישר, כך ש-h גדל עד n וכל פעולה מידרדרת ל-O(n), לא יותר טוב מרשימה מקושרת. עצים שמאזנים את עצמם כמו AVL או עצים אדומים-שחורים שומרים על גובה של O(log n) כדי למנוע את זה.
איור של שפות התכנות ב-Coddy

לשלוט באלגוריתמים עם Coddy

להתחיל