Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
מבני נתונים ויעילות אלגוריתמים
מכללת אורט כפר-סבא מבני נתונים ויעילות אלגוריתמים מימוש תור באמצעות מערך סטטי עץ בינארי אורי וולטמן
2
חידה לחימום 100 גמדים מבצעים טקס הדלקת 100 פנסים. בהתחלה, מאה הפנסים כבויים ומסודרים בטור. הגמד הראשון מדליק את כל הפנסים. הגמד השני מכבה את כל הפנסים שמיקומם זוגי. הגמד השלישי משנה מצב לכל פנס שלישי, הגמד הרביעי משנה מצב לכל פנס רביעי, וכך הלאה, עד שהגמד האחרון משנה את מצבו של הפנס המאה. אילו מהפנסים דלקו בסוף הטקס?
3
תור כזכור, כך נראה הממשק של טיפוס הנתונים המופשט 'תור':
4
תור איך נייצג תור בסביבת העבודה?
ניתן לייצג את איברי התור באמצעות מערך סטטי, ולשמור בנוסף עוד שני משתנים מטיפוס שלם: head יכיל את האינדקס של ראש התור, ואילו rear יכיל את האינדקס של זנב התור. #define QUEUE_MAX_SIZE 100 typedef int queue_item; typedef struct { queue_item items[QUEUE_MAX_SIZE]; int head, rear; } queue;
5
תור איך יראו פעולות הממשק ב-queue.h?
void queue_init(queue *q); /* הפונקציה בונה תור ריק */ void enqueue (queue *q, queue_item x); /* q לסוף התור x הפונקציה מכניסה את הערך */ queue_item dequeue (queue *q); /* הפונקציה שולפת את הערך שבראש התור ומחזירה אותו */ queue_item queue_top (queue q); /* הפונקציה מחזירה את הערך שבראש התור, מבלי לשלוף אותו */ int queue_empty (queue q); /* הפונקציה תחזיר 1 אם התור ריק, ו-0 אם לא */ int queue_full (queue q); /* הפונקציה תחזיר 1 אם התור מלא, ו-0 אם לא */ נשים לב, שלהבדיל מהאופן בו תיארנו את טנ"מ 'תור' באלגוריתמים המילוליים, כשניגש ליישמו בסביבת העבודה, נצטרך לכלול פעולת ממשק הבודקת האם התור מלא או לא, שכן בייצוג הסטטי שלנו – ייתכן ולא ניתן יהיה להכניס איברים נוספים.
6
תור איך תיראה פעולת איתחול תור (queue_init)? q->head = 0;
q->rear = -1; איך תיראה פעולת ההכנסה לתור ((enqueue? q->items[++q->rear] = x; איך תיראה פעולת ההוצאה מתור (dequeue)? return q->items[q->head++]; איך תיראה בדיקה האם התור הוא ריק (queue_empty)? return (q.head > q.rear);
7
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1
8
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1 head = 0 rear = -1
9
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1 A head = rear = 0
10
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1 B rear = 1 A head = 0
11
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1 C rear = 2 B A head = 0
12
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1 C rear = 2 B head = 1 A
13
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1 C head = rear = 2 B
14
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1 D rear = 3 C head = 2
15
תור נניח שגודלו של המערך המייצג את התור הוא חמישה איברים. שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות: queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); מה יקרה אם ננסה להכניס עוד איבר לתור? E 4 3 2 1 rear = 4 D C head = 2
16
תור גודל המערך חמישה איברים, והתור מכיל כרגע רק שלושה איברים. לכן, לכאורה אפשר להוסיף עוד איברים לתור המיוצג באמצעות מערך זה, בלי לחשוש מבעיה של גלישה (overflow). אולם, אם נרצה להוסיף איבר נוסף לתור, יהיה עלינו להגדיל את rear, וערכו החדש יהיה 5. אך זהו אינו אינדקס חוקי, שכן במערך בגודל חמישה איברים, האינדקסים הם בין 0 ל-4. יתרה מכך, אפשר להגיע למצב המוזר, שבו התור ריק – אך בכל זאת לא ניתן להוסיף לו איברים... E 4 3 2 1 rear = 4 D C head = 2
17
תור אחד הפתרונות האפשריים לבעיה, הוא הזזה של כל איברי התור לתחילת המערך, אחרי כל פעולה של הוצאת איבר מהתור. באופן הזה, ראש התור יהיה תמיד בתחילת המערך, ותמיד יתקיים ש- head = 0. לכן, בייצוג זה דרוש השדה rear בלבד. פעולת ההוצאה מתור (dequeue) תיראה כך: x = q->items[0]; for (i = 0; i < q->rear; i++) q->items[i] = q->items[i+1]; q->rear = q->rear – 1; return x; מהו החיסרון הבולט של פתרון זה?
18
4 3 2 1 תור שרטטו את מצב המערך אחרי כל אחת מההוראות הבאות:
queue_init(&q); enqueue(&q,’A’); enqueue(&q,’B’); enqueue(&q,’C’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’D’); enqueue(&q,’E’); 4 3 2 1
19
תור נניח שבמקום להזיז את כל איברי התור לתחילת המערך בכל ביצוע של פעולת הוצאה מתור, נבצע את ההזזה אך ורק כאשר ערכו של השדה rear שווה ל-QUEUE_MAX_SIZE-1. כלומר, נבצע את ההזזה רק כאשר זנב התור הגיע לסוף המערך. האם פתרון זה יבטיח שפעולת ההוצאה מהתור תתבצע ביעילות?
20
תור דרך אחרת להתגבר על המצב שבו אי אפשר להוסיף איברים לתור, אף כי המערך אינו מלא, היא להתייחס אל המערך המאחסן את התור כאל מערך מעגלי שבו האיבר הראשון עוקב לאיבר האחרון. התייחסות כזו למערך מאפשרת, אם המערך אינו מלא, להכניס איבר נוסף לתור גם כאשר התא האחרון במערך תפוס. במקרה שהתא האחרון במערך תפוס, ומתבצעת פעולה של הכנסה לתור, האיבר יוכנס לתוך התא הראשון במערך, במידה והוא פנוי.
21
4 3 2 1 תור E rear = 4 D C head = 2 נמחיש זאת באמצעות הדוגמא הבאה:
enqueue(&q,’F’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’G’); ch3 = dequeue(&q); E 4 3 2 1 rear = 4 D C head = 2
22
4 3 2 1 תור E D C head = 2 F rear = 0 נמחיש זאת באמצעות הדוגמא הבאה:
enqueue(&q,’F’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’G’); ch3 = dequeue(&q); E 4 3 2 1 D C head = 2 F rear = 0
23
4 3 2 1 תור E D head = 3 C F rear = 0 נמחיש זאת באמצעות הדוגמא הבאה:
enqueue(&q,’F’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’G’); ch3 = dequeue(&q); E 4 3 2 1 D head = 3 C F rear = 0
24
4 3 2 1 תור E head = 4 D F rear = 0 נמחיש זאת באמצעות הדוגמא הבאה:
enqueue(&q,’F’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’G’); ch3 = dequeue(&q); E 4 3 2 1 head = 4 D F rear = 0
25
4 3 2 1 תור E head = 4 G rear = 1 F נמחיש זאת באמצעות הדוגמא הבאה:
enqueue(&q,’F’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’G’); ch3 = dequeue(&q); E 4 3 2 1 head = 4 G rear = 1 F
26
4 3 2 1 תור E G rear = 1 F head = 0 נמחיש זאת באמצעות הדוגמא הבאה:
enqueue(&q,’F’); ch1 = dequeue(&q); ch2 = dequeue(&q); enqueue(&q,’G’); ch3 = dequeue(&q); E 4 3 2 1 G rear = 1 F head = 0
27
תור כך יראה קובץ המימוש queue.c בייצוג זה: void queue_init (queue *q)
{ q->head = 0; q->rear = -1; } void enqueue (queue *q, queue_item x) q->rear = (q->rear + 1) % QUEUE_MAX_SIZE; q->items[q->rear] = x; queue_item dequeue (queue *q) queue_item x = q->items[q->head]; q->head = (q->head + 1) % QUEUE_MAX_SIZE; return x;
28
תור המשך המימוש: queue_item queue_top (queue q) { return q.items[q.head]; } int queue_full (queue q) return (((q.rear + 1) % QUEUE_MAX_SIZE) == q.head); int queue_empty (queue q) נשים לב שבמימוש זה, אין ביכולתנו להבחין בין מצב בו התור מלא (ואז אסור להכניס לתוכו עוד איברים, אבל מותר להוציא), לבין מצב בו התור ריק (ואז אסור להוציא מתוכו איברים, אבל מותר להכניס). כיצד תשנו את המימוש של תור כדי שניתן יהיה להתגבר על בעיה זו?
29
תור ניתן, למשל, להוסיף משתנה בוליאני is_empty אל תוך המבנה המייצג את התור. כאשר מאתחלים תור חדש, ערכו של המשתנה יהיה 1 (אמת). כשמכניסים איבר לתור – הוא יקבל את הערך 0 (שקר). במימוש של פעולת הוצאה מתור, נוסיף בדיקה: האם בעקבות ביצוע ההוצאה, מתקיים כעת התנאי הבא – ((q.rear + 1) % QUEUE_MAX_SIZE) == q.head אם התנאי מתקיים בעקבות הוצאת איבר – נשים את הערך 1 (אמת) במשתנה is_empty. כעת, המימוש של פעולת הממשק הבודקת האם התור הוא ריק או לא, יתבצע פשוט על-ידי החזרת ערכו של q.is_empty. איך יתבצע המימוש של פעולת הממשק הבודקת האם התור מלא?
30
תור אפשרות נוספת, היא להוסיף משתנה count_items מטיפוס שלם אל תוך המבנה המייצג את התור. כאשר מאתחלים תור חדש, ערכו של המשתנה יהיה 0. כשמכניסים איבר לתור – נגדיל את המשתנה באחד, וכאשר מוציאים איבר מהתור – נקטין אותו באחד. כעת, המימוש של פעולת הממשק הבודקת האם התור הוא ריק או לא, יתבצע על-ידי בדיקה האם count_items הוא 0. ואילו המימוש של פעולת הממשק הבודקת האם התור מלא או לא, יתבצע על-ידי בדיקה האם count_items שווה ל-QUEUE_MAX_SIZE.
31
תור נסמן באות n את מספר האיברים המאוחסנים בתור ברגע נתון.
כל הפעולות הממשק הן מסיבוכיות קבועה Θ(1) .
32
עצים יישומים רבים במחשב עושים שימוש בעצים.
לדוגמא, מבנה התיקיות בדיסק הקשיח מאורגן בצורת עצים (כוננים שמכילים תיקיות, שמכילות תיקיות-משנה, שמכילות תיקיות-משנה, וכו'). פרוייקט ב-Microsoft Visual C++ מכיל קבצים רבים, מסוגים שונים, המאורגנים בצורת עץ. נגדיר מושגים לגבי עצים כלליים, ולאחר מכן נעסוק בעיקר בסוג מסוים של עצים הנקראים 'עצים בינאריים'.
33
עצים נתון עץ (tree), ונגדיר עליו את המושגים הבאים: כמה עלים יש בעץ זה?
צומת (node) – איבר בעץ. הורה (parent) – איבר קודם לצומת. ילד (child) – איבר עוקב לצומת. שורש (root) – צומת שאין לו הורה. עלה (leaf) – צומת שאין לו ילדים. אחים (siblings) – צמתים שהם ילדים לאותו הורה. כמה עלים יש בעץ זה? הגדרות נוספות: צאצא (descendant) – צומת הוא צאצא של צומת אחר, אם הוא ילדו, או אם הוא צאצא של ילדו. נשים לב שהגדרת הצאצא היא רקורסיבית. הצומת K הוא צאצא של כמה צמתים? הצומת K הוא צאצא של A, צאצא של C וצאצא של G. A N M O L K G C E F H I D B P J
34
עצים עוד הגדרות: הורה קדמון (ancestor) – צומת ייקרא 'הורה קדמון' של צומת אחר, אם הוא הורה שלו או אם הוא הורה קדמון של הורהו. תת-עץ (subtree) – צומת וצאצאיו מהווים עץ בפני עצמו. עץ זה הוא תת-עץ של העץ המקורי. הצמתים הצבועים בירוק מהווים תת-עץ של העץ המקורי. שורשו של תת-העץ הזה הוא הצומת K. קבעו האם הטענה הבאה נכונה או שקרית: הצומת A הוא הורה-קדמון של כל הצמתים בעץ. עץ מציית לכמה כללים: בעץ קיים רק שורש אחד. לכל צומת שאינו השורש יש הורה יחיד. כל צומת (לבד מהשורש) הוא צאצא של השורש. A N M O L K G C E F H I D B P J
35
עץ בינארי עץ בינארי (Binary Tree) הוא עץ שיש בו לכל היותר שני ילדים לצומת. את הילדים נכנה הילד השמאלי והילד הימני. כל אחד מאלה, אם הוא קיים, הוא שורש של עץ: הילד השמאלי הוא שורשו של עץ הנקרא תת-עץ שמאלי (left subtree). הילד הימני הוא שורשו של עץ הנקרא תת-עץ ימני (right subtree). מי מבין העצים האלה הוא עץ בינארי? עץ בינארי הוא טנ"מ שימושי, ולכן נעסוק בעיקר בו, ופחות בעץ כללי.
36
עץ בינארי רמה (level) של צומת מסוים בעץ היא אורך המסלול מהשורש אל צומת זה, כלומר – המרחק של הצומת מהשורש. רמת השורש היא 0, והרמה של כל צומת אחר בעץ גדולה באחד מהרמה של ההורה שלו. גובה עץ (tree height) הוא המרחק הגדול ביותר מהשורש לעלה כלשהו של העץ, כלומר – זוהי הרמה הגבוהה ביותר של העץ. מהו גובה העץ?
37
עץ בינארי בדומה למחסנית או תור, גם עץ בינארי יכול להיות ריק, כלומר – בלי צמתים כלל. כאשר העץ אינו ריק, ייתכן שהתת-עץ השמאלי, הימני או שניהם גם יחד ריקים. מה נוכל לומר על התת-עצים של עלה? נשים לב שניתן להגדיר עץ בינארי גם באופן רקורסיבי: עץ בינארי הוא: עץ ריק (כלומר, בלתי צמתים) או: שורש ושני תת-עצים, ימני ושמאלי, שכל אחד מהם הוא עץ בינארי. שני עצים בינאריים אלו זרים זה לזה, כלומר – אין להם צמתים משותפים. ההגדרה הרקורסיבית הזו מאפשרת לכתוב בקלות אלגוריתמים רקורסיביים שפועלים על עצים בינאריים.
38
עץ בינארי נתון העץ הבינארי הבא: השלימו: מס' הצמתים בעץ הוא
מס' העלים בעץ הוא השורש של תת-עץ השמאלי של E הוא W הוא של C C הוא של B הגובה של העץ הוא הצאצאים של E הם הצמתים ברמה 2 בעץ הם
39
עץ בינארי עבור כל אחת מהטענות הבאות, ציינו האם היא נכונה או לא:
B הוא צאצא של E, C ו-W. S ו-K הם אחים. ל-E יש שני ילדים. K הוא ברמה 3. אם הצמתים נמצאים באותה רמה, אז הם אחים. C הוא הורה קדמון של E ו-B.
40
עץ בינארי נבנה ממשק עבור טיפוס הנתונים המופשט (טנ"מ) 'עץ בינארי'. נגדיר פעולת ממשק בשם אתחל-עץ שמחזירה עץ בינארי ריק, ופעולת ממשק בשם בנה-עץ שמקבלת כפרמטרים שני עצים ואיבר, ומחזירה עץ חדש שבשורשו עומד האיבר, ושני התת-עצים שלו הם העצים שהועברו כפרמטרים. לדוגמא, נביט באלגוריתם הבא: אתחל-עץ T1 אתחל-עץ T2 בנה-עץ (T1,T2,7) T3 נניח ש- T4 ו-T5 הם העצים הבאים: לאחר שמבצעים את ההוראה הבאה בנה-עץ (T4,T5,’e’) T6 כיצד יראה העץ T6? T3 7 T1 T2 T6 T4 T5
41
עץ בינארי כדי לנוע על העץ נזדקק לשתי פעולות ממשק: האחת – גישה מצומת אל התת-עץ השמאלי, והאחרת – גישה מצומת אל התת-עץ הימני. פעולת הממשק תת-עץ שמאלי מקבלת עץ בינארי שאינו ריק, ומחזירה את התת-עץ השמאלי של שורשו. באופן דומה מגדירים את פעולת הממשק תת-עץ ימני. באמצעות שתי פעולות ממשק אלה נוכל להגיע לכל אחד מצומתי העץ. עתה נרצה להוסיף פעולות ממשק שיאפשרו לקרוא את תוכנו של צומת בעץ ולשנות אותו. מכיוון שכל צומת הוא שורש של תת-עץ, מספיק להגדיר פעולות איחזור ועדכון לשורש. פעולת הממשק אחזר-שורש מקבלת עץ בינארי ומחזירה את תוכן שורשו. פעולת הממשק עדכן-שורש מקבלת עץ ואיבר, ומשנה את התוכן של השורש להיות האיבר הנתון. שתי פעולות הממשק הללו לא תהיינה מוגדרות על עץ ריק.
42
עץ בינארי T1 T2 נניח שנתון העץ הבינארי 1T הבא:
איזה עץ בינארי נקבל בעקבות ההוראה: תת-עץ-ימני (T1) תת-עץ-שמאלי (T1) נניח שהעץ הבינארי ששורשו מכיל את הערך D נקרא T2. תת-עץ-ימני (T2) תת-עץ-שמאלי (T2) איזה ערך נקבל בעקבות ביצוע ההוראה: אחזר-שורש (T1) איך ישתנה העץ בעקבות ביצוע ההוראה: עדכן-שורש (T1,’Q’) עדכן-שורש (אחזר-שורש (T2), T1) T2
43
עץ בינארי T1 T2 נגדיר פעולות ממשק הבודקות ומשנות את מבנהו של העץ.
נגדיר פעולת ממשק בשם עץ-ריק? הבודקת האם עץ בינארי נתון הוא ריק. כמו כן, נגדיר שתי פעולות ממשק המחליפות תת-עץ של צומת בעץ אחר: פעולת הממשק החלף-תת-עץ-שמאלי תקבל עץ בינארי T לא ריק ועץ בינארי new_tree, ותחליף את התת-עץ השמאלי של T ב-new_tree. פעולת הממשק החלף-תת-עץ-ימני מוגדרת בהתאמה. נשים לב כי לאחר ההחלפה "יאבד" התת-עץ המקורי, שכן אין דרך לגשת אליו מתוך T. לכן בדרך כלל נבצע החלפה כזו רק כאשר התת-עץ המקורי הוא ריק. נניח שנתון העץ הבינארי T1 כמקודם, כאשר קראנו בשם T2 לתת-העץ ששורשו הוא D. נניח גם שנתון העץ הבינארי T3, המורכב מעלה המכיל את הערך 'H'. מה יקרה בעקבות ההוראות: החלף-תת-עץ-שמאלי (T2,T3) החלף-תת-עץ-ימני (T2,T3) T1 T2
44
עץ בינארי הממשק של טנ"מ 'עץ בינארי': פעולה המחזירה עץ בינארי ריק
אתחל-עץ פעולה המחזירה עץ בינארי שבשורשו האיבר x, התת-עץ השמאלי שלו L, והתת-עץ הימני שלו R. הנחות: העצים L ו-R מאותחלים. בנה-עץ (L,R,x) פעולה המחזירה את התת-עץ השמאלי של T. הנחות: T מאותחל ואינו ריק. תת-עץ-שמאלי (T) פעולה המחזירה את התת-עץ הימני של T. תת-עץ-ימני (T) פעולה המחליפה את התת-עץ השמאלי של T בעץ הבינארי new_tree. הנחות: העצים T ו- new_tree מאותחלים, T איננו ריק. החלף-תת-עץ-שמאלי (T,new_tree)
45
עץ בינארי הממשק של טנ"מ 'עץ בינארי':
פעולה המחליפה את התת-עץ הימני של T בעץ הבינארי new_tree. הנחות: העצים T ו- new_tree מאותחלים, T איננו ריק. החלף-תת-עץ-ימני (T,new_tree) פעולה המחזירה את האיבר שבשורשו של T. הנחות: T מאותחל ואיננו ריק. אחזר-שורש (T) פעולה המשנה את התוכן של שורש T להיות x. הנחות: T מאותחל ואיננו ריק עדכן-שורש (T,x) פעולה המחזירה 'אמת' אם העץ הבינארי T הוא עץ ריק, ו'שקר' אחרת. הנחה: T מאותחל. עץ-ריק?(T)
46
עץ בינארי נכתוב אלגוריתם בשם עלה? המקבל עץ בינארי T, ומחזיר 'אמת' אם T הוא עלה, ו-'שקר' אם לא. עלה? (T) אם עץ-ריק? (T) , אזי: החזר 'שקר' אחרת: החזר עץ-ריק? (תת-עץ-ימני (T) ) וגם עץ-ריק? (תת-עץ-שמאלי (T) ) מהי סיבוכיות זמן הריצה של האלגוריתם (בהנחה שסיבוכיות פעולות הממשק היא קבועה)?
47
עץ בינארי לפניכם האלגוריתם הבא, המקבל כפרמטר עץ בינארי T, ומחזיר מס' שלם: סוד (T) אם עץ-ריק? (T) , אזי: החזר 0 אחרת: החזר 1 + סוד (תת-עץ-ימני (T) ) + סוד (תת-עץ-שמאלי (T) ) הפעילו את האלגוריתם הרקורסיבי 'סוד' על העץ הבינארי הבא, וקבעו מה הוא מבצע. תנו לאלגוריתם שם משמעותי במקום 'סוד'. נסמן ב-n את מס' הצמתים בעץ הבינארי T. מהי סיבוכיות האלגוריתם?
48
עץ בינארי לפניכם האלגוריתם הבא, המקבל כפרמטר עץ בינארי T, ומחזיר מס' שלם: סוד (T) אם עץ-ריק? (T) , אזי: החזר 0 אחרת: החזר אחזר-שורש (T) + סוד (תת-עץ-ימני (T) ) + סוד (תת-עץ-שמאלי (T) ) הפעילו את האלגוריתם הרקורסיבי 'סוד' על העץ הבינארי הבא, וקבעו מה הוא מבצע. תנו לאלגוריתם שם משמעותי במקום 'סוד'. נסמן ב-n את מס' הצמתים בעץ הבינארי T מהי סיבוכיות האלגוריתם? האם אפשר היה לנסח תנאי עצירה אחר, העושה שימוש באלגוריתם עלה?, כך שהאלגוריתם עדיין יפתור את הבעיה?
49
עץ בינארי כזכור, גובה של עץ בינארי הוא המרחק הגדול ביותר בין שורש העץ לבין אחד מהעלים. המרחק של השורש מעצמו – הוא 0; המרחק של ילדיו של השורש ממנו – הוא 1; וכך הלאה. כתבו אלגוריתם רקורסיבי המקבל כקלט עץ בינארי T לא ריק, ומחזיר מס' שלם אי-שלילי המבטא את גובהו של העץ. נניח שגובהו של עץ ריק יוגדר להיות 1-. כתבו אלגוריתם רקורסיבי המקבל כקלט עץ בינארי T כלשהו (כלומר, העץ עשוי להיות ריק) ומחזיר מס' שלם המבטא את גובהו של העץ.
50
סריקת עץ בינארי שימושים רבים בעץ בינארי מצריכים מעבר על איברי העץ ללא חזרות. בשני האלגוריתמים האחרונים שראינו, למשל, יש לבקר בכל צומת בדיוק פעם אחת. על צמתי העץ ניתן לעבור בשלושה סוגי סדרים: סריקה בסדר תחילי (preorder traversal) סריקה בסדר תוֹכי (inorder traversal) סריקה בסדר סופי (postorder traversal) בשלושת סוגי הסריקות מתבצעות הפעולות הבאות, אך בכל סריקה הן מתבצעות בסדר שונה: ביקור בשורש העץ סריקה רקורסיבית של תת-העץ השמאלי סריקה רקורסיבית של תת-העץ הימני אם הביקור בשורש מתבצע ראשון, הסריקה נקראת סריקה בסדר תחילי. אם הביקור בשורש מתבצע בשלב השני (בין שני הזימונים הרקורסיביים) אז זו סריקה בסדר תוכי, ואם הביקור בשורש מתבצע אחרון אז זו סריקה בסדר סופי.
51
סריקת עץ בינארי כאמור, סריקת עץ מורכבת משלושת הצעדים האלה:
ביקור בשורש העץ סריקה רקורסיבית של תת-העץ השמאלי סריקה רקורסיבית של תת-העץ הימני "ביקור בשורש העץ" פירושו לבצע פעולה כלשהי על הצומת. לדוגמא: להוסיף את הערך שבצומת לצובר, או להציג אותו כפלט, להגדיל מונה ב-1, וכו'. בכל שלוש הסריקות, כאשר תת-העץ אינו קיים, לא ממשיכים לרדת בכיוון זה של העץ. מבחינת סיבוכיות זמן הריצה, בכל סריקה מבקרים בכל צומת פעם אחת. לכן, אם נסמן ב-n את מס' הצמתים בעץ הבינארי, ואם מבצעים על כל צומת כמות קבועה של פעולות, סיבוכיות הסריקה תהיה Θ(n). נדגים כיצד פועל האלגוריתם הרקורסיבי לסריקה בסדר תחילי (preorder traversal).
52
סריקת עץ בינארי A B C D E F G H 1 (T) סרוק-בסדר-תחילי (T) ?עץ-ריק
אם לא (1) B C (T) בקר בשורש (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) D E F ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H
53
סריקת עץ בינארי A A B C D E F G H 1 (T) סרוק-בסדר-תחילי (T) ?עץ-ריק
אם לא (1) B C (T) בקר בשורש (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) D E F ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A
54
סריקת עץ בינארי A A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש (1.1)
(1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 1 B C D E F G H A
55
סריקת עץ בינארי A A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 2 B C D E F G H A
56
סריקת עץ בינארי A,B A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B
57
סריקת עץ בינארי A,B A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B
58
סריקת עץ בינארי A,B A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 3 B C (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B
59
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D
60
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D
61
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 4 (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D
62
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) 4 (T) סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) (T) בקר בשורש (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) A,B,D
63
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) (T) סרוק-בסדר-תחילי (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D
64
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 4 (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D
65
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) 4 (T) סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) (T) בקר בשורש (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) A,B,D
66
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) (T) (T) סרוק-בסדר-תחילי סרוק-בסדר-תחילי סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) B C (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D
67
סריקת עץ בינארי A,B,D A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) (T) (T) סרוק-בסדר-תחילי סרוק-בסדר-תחילי סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 3 B C (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D
68
סריקת עץ בינארי A,B,D,E A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) (T) (T) סרוק-בסדר-תחילי סרוק-בסדר-תחילי סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E
69
סריקת עץ בינארי A,B,D,E A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) (T) (T) סרוק-בסדר-תחילי סרוק-בסדר-תחילי סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E
70
סריקת עץ בינארי A,B,D,E A B C D E F G H סרוק-בסדר-תחילי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) (T) (T) סרוק-בסדר-תחילי סרוק-בסדר-תחילי סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 4 (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E
71
סריקת עץ בינארי A,B,D,E,G A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) (T) (T) סרוק-בסדר-תחילי סרוק-בסדר-תחילי סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) 4 (T) סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) (T) בקר בשורש (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) A,B,D,E,G
72
סריקת עץ בינארי A,B,D,E,G A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 1 B C D E F G H A,B,D,E,G
73
סריקת עץ בינארי A,B,D,E,G A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 2 B C D E F G H A,B,D,E,G
74
סריקת עץ בינארי A,B,D,E,G,C A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E,G,C
75
סריקת עץ בינארי A,B,D,E,G,C A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E,G,C
76
סריקת עץ בינארי A,B,D,E,G,C A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 3 B C (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E,G,C
77
סריקת עץ בינארי A,B,D,E,G,C,F A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E,G,C,F
78
סריקת עץ בינארי A,B,D,E,G,C,F A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.1) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E,G,C,F
79
סריקת עץ בינארי A,B,D,E,G,C,F A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) סרוק-בסדר-תחילי (T) בקר בשורש (1.1) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.2) 4 (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H A,B,D,E,G,C,F
80
סריקת עץ בינארי A,B,D,E,G,C,F,H A B C D E F G H סרוק-בסדר-תחילי (T)
בקר בשורש (1.2) (1.3) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1) ?עץ-ריק אם לא ((T)תת-עץ-שמאלי (1.1) 1 2 (T) סרוק-בסדר-תחילי 3 (T) סרוק-בסדר-תחילי B C (T) ?עץ-ריק אם לא (1) 4 (T) סרוק-בסדר-תחילי (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) (T) ?עץ-ריק אם לא (1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) (T) בקר בשורש (1.1) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.1) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) ((T)תת-עץ-שמאלי )סרוק-בסדר-תחילי (1.2) ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) G H ((T)תת-עץ-ימני )סרוק-בסדר-תחילי (1.3) A,B,D,E,G,C,F,H
81
סריקת עץ בינארי A B C העץ נסרק D E F G H A,B,D,E,G,C,F,H
82
סריקת עץ בינארי A B C D E F G H
אנחנו רואים שבעקבות ביצוע סריקה בסדר תחילי על העץ הבינארי הבא, התקבלה סדרת הערכים A,B,D,E,G,C,F,H. הערך הראשון שהתקבל בסדרת הערכים (A) זהה לערך המאוחסן בשורש העץ הבינארי. האם תמיד זה כך בעת שעושים סריקה בסדר תחילי? הערך האחרון שהתקבל בסדרת הערכים (H) מאוחסן באחד מהעלים בעץ הבינארי. האם תמיד זה כך בעת שעושים סריקה בסדר תחילי? עומק הקינון של הזימונים הרקורסיביים אליו הגענו בדוגמא הוא 5. מה תוכלו לומר בד"כ על עומק הקינון אליו מגיעים בעת סריקה? האם תוכלו לשער איזו סדרת ערכים תתקבל בעקבות ביצוע סריקה בסדר תוכי (inorder traversal) על עץ בינארי זה? נדגים את ריצת האלגוריתם הרקורסיבי הסורק בסדר תוכי עץ בינארי זה. A B C D E F G H
83
סריקת עץ בינארי A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 B C D E F G H
84
סריקת עץ בינארי A B C D E F G H 1 סרוק-בסדר-תוכי (T) (T) ?עץ-ריק אם לא
(1) B C ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H
85
סריקת עץ בינארי A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 2 (T) סרוק-בסדר-תוכי B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H
86
סריקת עץ בינארי A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 2 (T) סרוק-בסדר-תוכי B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H
87
סריקת עץ בינארי A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 2 (T) סרוק-בסדר-תוכי 3 (T) סרוק-בסדר-תוכי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H
88
סריקת עץ בינארי A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 2 (T) סרוק-בסדר-תוכי 3 (T) סרוק-בסדר-תוכי B C (T) ?עץ-ריק אם לא (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H
89
סריקת עץ בינארי A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 (T) סרוק-בסדר-תוכי B C 4 (T) סרוק-בסדר-תוכי (T) ?עץ-ריק אם לא (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3)
90
סריקת עץ בינארי A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 (T) סרוק-בסדר-תוכי B C 4 (T) סרוק-בסדר-תוכי (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3)
91
סריקת עץ בינארי D A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 סרוק-בסדר-תוכי (T) B C (T) ?עץ-ריק אם לא (1) (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D
92
סריקת עץ בינארי D A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 סרוק-בסדר-תוכי (T) B C (T) ?עץ-ריק אם לא (1) (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D
93
סריקת עץ בינארי D A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 (T) סרוק-בסדר-תוכי B C סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 4 (T) ?עץ-ריק אם לא (1) (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D
94
סריקת עץ בינארי D A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 סרוק-בסדר-תוכי (T) B C 4 (T) סרוק-בסדר-תוכי (T) ?עץ-ריק אם לא (1) (1) (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) D
95
סריקת עץ בינארי D,B A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 2 (T) סרוק-בסדר-תוכי B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B
96
סריקת עץ בינארי D,B A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 2 (T) סרוק-בסדר-תוכי B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B
97
סריקת עץ בינארי D,B A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 3 B C D E F G H D,B
98
סריקת עץ בינארי D,B A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 (T) סרוק-בסדר-תוכי B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B
99
סריקת עץ בינארי D,B A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש (1.2)
(1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 (T) סרוק-בסדר-תוכי B C סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 4 (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B
100
סריקת עץ בינארי D,B,G A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 2 3 (T) סרוק-בסדר-תוכי B C 4 סרוק-בסדר-תוכי (T) (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) D,B,G
101
סריקת עץ בינארי D,B,G,E A B C D E F G H סרוק-בסדר-תוכי (T) בקר בשורש
(1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 1 2 סרוק-בסדר-תוכי (T) 3 (T) סרוק-בסדר-תוכי B C (T) ?עץ-ריק אם לא (1) (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E
102
סריקת עץ בינארי D,B,G,E,A A B C D E F G H 1 סרוק-בסדר-תוכי (T) (T)
?עץ-ריק אם לא (1) B C ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A
103
סריקת עץ בינארי D,B,G,E,A A B C D E F G H 1 סרוק-בסדר-תוכי (T) (T)
?עץ-ריק אם לא (1) B C ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) D E F ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A
104
סריקת עץ בינארי D,B,G,E,A A B C D E F G H 1 סרוק-בסדר-תוכי (T) 2 (T)
?עץ-ריק אם לא (1) B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A
105
סריקת עץ בינארי D,B,G,E,A,C A B C D E F G H 1 סרוק-בסדר-תוכי (T) 2 (T)
?עץ-ריק אם לא (1) B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A,C
106
סריקת עץ בינארי D,B,G,E,A,C A B C D E F G H 1 סרוק-בסדר-תוכי (T) 2 (T)
?עץ-ריק אם לא (1) B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A,C
107
סריקת עץ בינארי D,B,G,E,A,C A B C D E F G H 1 (T) סרוק-בסדר-תוכי 2 (T)
?עץ-ריק אם לא (1) סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 3 B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A,C
108
סריקת עץ בינארי D,B,G,E,A,C A B C D E F G H 1 סרוק-בסדר-תוכי (T) 2
?עץ-ריק אם לא (1) 3 סרוק-בסדר-תוכי (T) B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A,C
109
סריקת עץ בינארי D,B,G,E,A,C A B C D E F G H 1 (T) סרוק-בסדר-תוכי 2 (T)
?עץ-ריק אם לא (1) סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 3 B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 4 ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A,C
110
סריקת עץ בינארי D,B,G,E,A,C,H A B C D E F G H 1 סרוק-בסדר-תוכי (T) 2
?עץ-ריק אם לא (1) סרוק-בסדר-תוכי (T) בקר בשורש (1.2) (1.3) ((T)תת-עץ-שמאלי (1.1) ) סרוק-בסדר-תוכי ((T)תת-עץ-ימני (1) ?עץ-ריק אם לא 3 B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) 4 (T) סרוק-בסדר-תוכי ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) בקר בשורש (1.2) (T) ?עץ-ריק אם לא (1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) (T) בקר בשורש (1.2) G H ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) D,B,G,E,A,C,H
111
סריקת עץ בינארי D,B,G,E,A,C,H A B C D E F G H 1 (T) סרוק-בסדר-תוכי 2
?עץ-ריק אם לא (1) 3 סרוק-בסדר-תוכי (T) B C (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) (T) ?עץ-ריק אם לא (1) ((T)תת-עץ-שמאלי ) סרוק-בסדר-תוכי (1.1) D E F (T) בקר בשורש (1.2) ((T)תת-עץ-ימני ) סרוק-בסדר-תוכי (1.3) G H D,B,G,E,A,C,H
112
סריקת עץ בינארי A B C העץ נסרק D E F G H D,B,G,E,A,C,H,F
113
סריקת עץ בינארי A B C D E F G H
ראינו קודם שבעקבות ביצוע סריקה בסדר תחילי על העץ הבינארי הבא, התקבלה סדרת הערכים A,B,D,E,G,C,F,H. כעת ראינו שבעקבות ביצוע סריקה בסדר תוכי על העץ הבינארי הבא, התקבלה סדרת הערכים D,B,G,E,A,C,H,F. הערך הראשון שהתקבל בסדרת הערכים (D) זהה לערך המאוחסן באחד מהעלים בעץ הבינארי. האם תמיד זה כך בעת שעושים סריקה בסדר תוכי? מהו תוכלו לומר על הערכים המופיעים משמאל לערך השורש (A) בסדרת הערכים הנ"ל? ועל הערכים המופיעים מימין לערך השורש? האם תוכלו לשער איזו סדרת ערכים תתקבל בעקבות ביצוע סריקה בסדר סופי (postorder traversal) על עץ בינארי זה? בדקו זאת בעצמכם. A B C D E F G H
114
סריקת עץ בינארי נתון העץ הבינארי הבא.
כתבו את סדרת הערכים המתקבלת מסריקת העץ... בסדר תחילי בסדר תוכי בסדר סופי תנו דוגמא לעץ בינארי לא ריק שעבורו שלושת הסריקות יתנו את אותה סדרת ערכים. תנו דוגמא כנ"ל, אולם הפעם כל איברי העץ צריכים בהכרח להיות שונים זה מזה. האם יש דוגמא כזו, בה מדובר בעץ שאינו עלה?
115
תרגילים כתבו אלגוריתם המקבל עץ בינארי המכיל מספרים ממשיים, ומקטין את ערכו של כל איבר בעץ פי 2. כתבו אלגוריתם המקבל עץ בינארי המכיל מס' שלמים, ומחזיר את מס' הצמתים שבהם מופיעים ערכים זוגיים. כתבו אלגוריתם המקבל עץ בינארי, ומציג כפלט את כל הערכים המופיעים בעלים. כתבו אלגוריתם המקבל עץ בינארי, ומחזיר את סכום ערכי הצמתים שיש להם שני בנים.
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.