005.class6_Trees
Download
Report
Transcript 005.class6_Trees
מבני נתונים
שיעור – 6עצים ,עצים בינאריים
עצי חיפוש ,עצי .AVL
עצים
• עץ הינו מבנה נתונים היררכי הבנוי בדומה לעץ עם
ענפים ועלים.
עצים -הגדרה
• מבנה נתונים היררכי מופשט.
• עץ מורכב מאיברים בעלי יחסי הורה-ילד
• שימושים:
– תרשימים לארגון נתונים
– ארגון קבצים (תיקיות וקבצים)
– מבנים וארגונים היררכיים (צבא ,מפעל)
R&D
Computers”R”Us
Manufacturing
Desktops
Laptops
Canada
Sales
International
Asia
US
Europe
מושגי יסוד
•
•
•
•
•
•
•
•
שורש -איבר ללא הורה ()A
ענף (איבר פנימי) -בעל לפחות ילד אחד ()A,B,C,F
עלה (איבר חיצוני) – איבר ללא ילדים )(D,E,G,H,I,J,K
אב קדמון של איבר -כל דורות ההורים
עומק של איבר – מספר האבות הקדמונים )(F=2
A
גובה העץ – עומק מקסימלי בכל העץ ()3
צאצאים – ילדים ,נכדים וכו'
C
D
תת עץ – מורכב מאיבר וכל צאצאיו
H
G
subtree
B
E
F
K
J
I
תכונות של עצים
•
•
•
•
•
מבנה היררכי ללא מעגלים
קיים מסלול יחיד מהשורש לכל אחד מאיברי העץ
לכל איבר הורה יחיד אך יכולים להיות לו מספר
ילדים
סדר – קיים סדר מסויים לעבור על איברי העץ.
רקורסיה – כל תת-עץ מקיים את כל התכונות של
העץ כולו
מבנה העץ
כל איבר ) (Nodeמכיל:
.1נתונים
.2מצביע על ההורה
.3מערך מצביעים על הילדים
D
E
B
F
B
F
A
D
A
C
E
C
עץ בינארי
• עץ בינארי הוא עץ בעל התכונות הבאות:
– לכל איבר פנימי יש לכל היותר 2ילדים
– ערכי הילדים של איבר פנימי מסודרים ע"פ סדר מסויים
– הילדים של איבר פנימי נקראים "ילד שמאלי" ו"ילד ימני"
בהתאמה
A
• שימושים:
– מיון
– תהליכי החלטה
– ביטויים אריתמטיים
C
G
B
F
D
E
I
H
דוגמאות לעצים בינאריים
A
A
B
B
C
C
D
E
F
G
D
H
I
Tree A
Size 9 Depth 3
E
Tree B
Size 5 Depth 4
עץ בינארי של ביטוי אריתמטי
•
•
•
•
ניתן להגדיר ביטויים אריתמטיים בעזרת עץ בינארי
איברים פנימיים – פעולות אריתמטיות
איברים חיצוניים (עלים) – מספרים/משתנים
דוגמא :הביטוי )) (2 (a - 1) + (3 bמתואר בעץ:
+
b
-
3
1
2
a
עצי החלטה בינאריים
•
•
•
•
עץ החלטה בינארי מתאר תהליך קבלת החלטה
איברים פנימיים – שאלות עם תשובות כן/לא
איברים חיצוניים (עלים) – החלטות
דוגמא :עץ החלטה על ארוחת ערב
?Want a fast meal
No
Yes
?On expense account
?How about coffee
No
Yes
No
Yes
Café Paragon
Al Forno
Spike’s
Starbucks
עצי חיפוש בינאריים
• חוקיות סדר בעץ חיפוש בינארי :לכל איבר ערך
הילד השמאלי תמיד קטן מהאיבר וערך הילד
הימני תמיד גדול מהאיבר.
• חוקיות זו משמעותה שעץ בינארי לא יכיל שני
ערכים זהים.
• שיטות הכנסת והוצאת איברים מהעץ דואגות
לשמר את חוקיות הסדר.
עצי חיפוש בינאריים- דוגמאות
25
53
10
37
Binary Search Tree 2
15
30
Binary Search Tree 1
30
50
59
62
Binary Search Tree 3
65
יתרונות בעץ חיפוש בינארי
•
•
•
•
•
משלב יתרונות של מערך ממויין ורשימה מקושרת
ניתן לבצע חיפוש במהירות בדומה למערך ממויין
חיפוש ברשימה מקושרת יקר ,מדוע?
ניתן למחוק ולהכניס איברים בקלות בדומה
לרשימה מקושרת
הכנסת איבר למערך ממויין מורכב ,מדוע?
מבנה עץ בינארי
A
B
C
D
E
F
H
G
Abstract Tree Model
left
left
B
G
right
right
left
left
A
left
D
right
left
E
right
right
right
left
Tree Node Model
C
left
H
right
F
right
מימוש עץ בינארי בג'אווה
Node מחלקה
public class Node
{
public int data;
private Node leftChild;
private Node rightChild;
}
מימוש עץ בינארי בג'אווה
Tree מחלקת
public class Tree
{
private Node root;
//Methods
public Node find(int key)
public void insert(int key)
public void delete(int key)
//and more methods…
}
מימוש עץ בינארי בג'אווה
Main דוגמא למחלקת
public class Maim
{
public static void main(String[] args)
{
Tree theTree = new Tree();
theTree.insert(50);
theTree.insert(70);
theTree.insert(12);
Node x = theTree.find(70);
theTree.delete(12);
Node y = theTree.find(12);
}
}
שיטת find
•
•
•
•
פעולת חיפוש הינה פעולה פשוטה בעץ בינארי
עקב המבנה והסדר המיוחד של העץ.
מחפשת אוביקט Nodeעם מפתח מסוים ,אם
נמצא מחזירה את האוביקט אם לא מחזירה null
המפתח יכול להיות תעודת זהות או מס' סידורי
מתחילים מהשורש ,אם מפתח השורש שווה
למבוקש סיימנו ,אם המפתח המבוקש גדול ממנו
עוברים לילד הימני אחרת לשמאלי .וממשיכים עד
שמוצאים ,או שהעץ נגמר.
דוגמא לחיפוש – איבר 57
חיפוש ערך בעץ בינארי
Current Node
Root = 50
Node = 30
Node = 35
Node = 37
(Node = 37)
Action
Compare item = 37 and 50
37 < 50, move to the left subtree
Compare item = 37 and 30
37 > 30, move to the right subtree
Compare item = 37 and 35
37 > 35, move to the right subtree
Compare item = 37 and 37. Item
found.
50
30
55
25
10
35
32
15
53
37
60
62
find מימוש שיטת
public Node find (int key){
Node current = root;
while (current.data != key){
if(key < current.data)
current = current.leftChild; //בן שמאלי
else
current = current.rightChild; //בן ימני
if(current == null)
return null //לא נמצא
}
return current;//איבר מוחזר
}
find מימוש רקורסיבי שיטת
public Node findR (int key, Node current){
if(current == null);
return null //לא נמצא
if(key < current.data)
return findR(key, current.leftChild); //בן שמאלי
if(key == current.data)
return current;//איבר מוחזר
if(key > current.data)
return findR(key, current.rightChild); //בן ימני
}
שיטת insert
• פעולת הכנסת איבר היא למעשה זהה לפעולת
חיפוש איבר שאינו קיים.
• בדומה לחיפוש איבר ,בהכנסת איבר חדש
"מטיילים" על העץ עד שמגיעים לעלה ,אשר הופך
להורה של האיבר החדש המוכנס.
• האיבר החדש יהיה בן שמאלי של העלה אם הוא
קטן ממנו ,או בן ימני אם הוא גדול ממנו (בהתאם
לחוקיות הסדר)
שיטת - insertדוגמא
6
<
9
>
8
>
2
1
4
w
6
2
9
4
8
w
5
1
•הכנסת הערך .5
•תחילה מתבצע חיפוש findעם
המפתח 5
•אנו מניחים שלא קיים איבר עם ערך 5
•כאשר מגיעים לעלה Wמוסיפים את
האיבר החדש במקומו (מימין ל )4
סריקת איברי העץ Traversing -
• פעולה זו עוברת על כל איברי העץ ע"פ סדר מסוים
• פעולת הסריקה פחות שימושית מחיפוש איבר
מסוים
• קיימות 3דרכים פשוטות לסריקת עץ בינרי
– :Inorderסריקה על כל איברי העץ בסדר עולה
– :Preorderכל איבר נסרק לפני הילדים שלו
– :Postorderכל איבר נסרק אחרי הילדים שלו
סריקת Inorder
•
•
•
•
צורת הסריקה השכיחה והשימושית ביותר.
מאפשר ליצור רשימה ממוינת של איברי העץ
מימוש רקורסיבי יעיל לסריקת Inorder
השיטה נקראת עם איבר נוכחי ,כאשר מתחילים
מהשורש ,ומבצעת שלושה פעולות:
.1השיטה קוראת לעצמה (רקורסיה) עם הבן השמאלי
.2מבצעת פעולה על האיבר הנוכחי (פעולת הביקור)
.3השיטה קוראת לעצמה (רקורסיה) עם הבן הימני
דוגמא -סריקת Inorder
דוגמא -סריקת Inorder
סריקת Preorder
• שיטה רקורסיבית לסריקת Preorderנקראת עם
איבר נוכחי החל מהשורש:
.1מבצעת פעולה על האיבר הנוכחי (פעולת הביקור)
.2השיטה קוראת לעצמה (רקורסיה) עם הבן השמאלי
.3השיטה קוראת לעצמה (רקורסיה) עם הבן הימני
• שיטת סריקה זו שימושית כאשר יש להדפיס
מסמך עם פרקים ותתי פרקים ע"פ הסדר
Preorder דוגמא – סריקת
1
Make Money Fast!
2
5
1. Motivations
9
2. Methods
3
4
1.1 Greed
1.2 Avidity
6
2.1 Stock
Fraud
7
2.2 Ponzi
Scheme
References
8
2.3 Bank
Robbery
סריקת Postorder
• שיטה רקורסיבית לסריקת Postorderנקראת עם
איבר נוכחי החל מהשורש:
.1השיטה קוראת לעצמה (רקורסיה) עם הבן השמאלי
.2השיטה קוראת לעצמה (רקורסיה) עם הבן הימני
.3מבצעת פעולה על האיבר הנוכחי (פעולת הביקור)
• שיטת סריקה זו שימושית כאשר יש לחשב נפח
קבצים של תיקיות ותתי תיקיות.
Postorder דוגמא – סריקת
9
cs16/
3
8
7
homeworks/
todo.txt
1K
programs/
1
2
h1c.doc
3K
h1nc.doc
2K
4
DDR.java
10K
5
Stocks.java
25K
6
Robot.java
20K
מחיקת איבר מעץ בינארי
25
//
\\
10
37
15
65
30
Delete node 25
30
37
10
65
15
30
Bad Solution: 30 is out of place
(a)
10
37
65
15
Good Solution
(b)
מקרה א – מחיקת עלה
Before
After
40
40
30
P
D
25
10
35
26
30
65
50
P
25
35
26
33
29
Delete leaf node 10.
pNodePtr->left is dNode
50
33
29
34
28
65
34
28
No replacement is necessary.
pNodePtr->left is NULL
מקרה ב – מחיקת איבר עם בן שמאלי בלבד
After
Before
40
40
P
30
25
10
D
26
33
29
P
65
35
R
30
25
50
10
28
Delete node 35 with only a left child:
Node R is the left child.
R
33
50
34
26
34
65
29
28
Attach node R to the parent.
מקרה ב – מחיקת איבר עם בן ימני בלבד
Before
After
40
40
30
P
10
65
25
D
35
26
R
P
50
33
29
30
10
34
65
25
R
28
35
29
50
33
34
28
Delete node 26 with only a right child:
Node R is the right child.
Attach node R to the parent.
...מקרה ב – מחיקת איבר עם שני בנים
40
40
30
65
25
10
35
26
50
33
29
65
25
35
26
10
34
28
50
33
29
34
28
Delete node 30 with two children.
?שיעור הבא? אולי שנה הבא
Orphaned subtrees.
תרגיל
נתון עץ בינארי כלשהו בעל nצמתים .בכל צומת יש:
•
•
•
.1
.2
.3
מפתח – מספר טבעי כלשהו
שני מצביעים לבנים
שדה נוסף המכיל מספר טבעי (מותר להשתמש בו לביצוע המשימה הנדרשת)
הצע אלג' לחישוב ערכו של המסלול הכבד ביותר בעץ מהשורש לעלה .המסלול
הכבד הינו המסלול שסכום המפתחות בצמתים שלו הוא מקסימלי.
יש להדפיס את הערכים לאורך מסלול זה.
סיבוכיות זמן נדרשת – )O(n
פתרון
•
חישוב הערך:
•
•
מחשבים באופן רקורסיבי עבור שני תת-העצים ומוסיפים את ערך השורש למקסימום
מבינהם.
הדפסת המסלול:
•
•
בשדה הנוסף בכל צומת נרשום 0אם המקסימום התקבל מתת-העץ השמאלי ,ו 1 -אם
מהימני.
לאחר חישוב הערך נדפיס לאורך המסלול המסומן את ערכיו.
דוגמא:
100+20
20
50
0
100