תרגול 5 - Trees, BSTs עצים ועצי חיפוש בינאריים עץ - Tree ADT that stores elements hierarchically. With the exception of the root, each.
Download
Report
Transcript תרגול 5 - Trees, BSTs עצים ועצי חיפוש בינאריים עץ - Tree ADT that stores elements hierarchically. With the exception of the root, each.
תרגול 5
- Trees, BSTsעצים ועצי חיפוש בינאריים
עץ- Tree
ADT that stores elements hierarchically.
With the exception of the root, each node in the tree has a parent and zero or more
children nodes.
Access methods in the tree ADT:
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.
depth(node v)
The depth of node v = the number of ancestors of v
• depth(root) = 0
• depth(v ≠ root) = depth(v.parent) + 1
height(node v)
The maximum height of a node v in T
• 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()
The height of the root of T
– עץ בינאריBinary Tree
• Each node has at most two children, left-son and right-son.
• Full Binary Tree – A binary tree in which each node has
exactly zero or two children
– A full binary tree with n leaves has n-1 inner nodes.
• Complete Binary Tree - A binary tree in which every level,
except possibly the deepest, is completely filled. At depth
n, the height of the tree, all nodes must be as far left as
possible.
– A complete binary tree of height h has between 2h and 2h+1-1
nodes.
– The height of a complete binary tree with n nodes is log 𝑛
הליכות בעץ בינארי
• 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
Rec. call on
right child
Return
7
8
3
12
Inorder: 3, 8, 12, 15, 7, 13
13
הליכות בעץ בינארי
• 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
Rec. call on
right child
Return
7
8
3
12
Preorder: 15, 8, 3, 12, 7, 13
13
הליכות בעץ בינארי
• 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
7
8
Write current node
and Return
3
12
Postorder: 3, 12, 8, 13, 7, 15
13
k-Tree
• Each node has k children at most.
• Representation option: “left child - right
sibling”,
– each node has the following pointers:
• parent
• left child - a pointer to the left most child.
• right-sibling - a pointer to the next sibling on the
right.
3 תרגיל
Preorder מההליכותT שחזרו את העץ הבינארי
: הנתונות שלוInorder ו
Inorder: c,d,b,a,h,g,j,e,f.
Preorder: a,b,c,d,e,g,h,j,f.
תרגיל 3
שחזרו את העץ הבינארי Tמההליכות Preorder
ו Inorderהנתונות שלו:
Preorder: a,b,c,d,e,g,h,j,f.
שורש העץ
Inorder: c,d,b,a,h,g,j,e,f.
אחרי השורש –
תת-עץ ימני
לפני השורש –
תת-עץ שמאלי
a
h,g,j,e,f
c,d,b
3 תרגיל
Preorder מההליכותT שחזרו את העץ הבינארי
: הנתונות שלוInorder ו
Inorder: c,d,b,a,h,g,j,e,f.
Preorder: a,b,c,d,e,g,h,j,f.
Inorder וPreorder אנחנו יודעים את ההליכותb,c,d עץ-לתת
:Tכיוון שהן ההליכות המושרות מ
a
c,d,b
Inorder: c,d,b.
h,g,j,e,f
Preorder: b,c,d.
3 תרגיל
Preorder מההליכותT שחזרו את העץ הבינארי
: הנתונות שלוInorder ו
Inorder: c,d,b,a,h,g,j,e,f.
Preorder: a,b,c,d,e,g,h,j,f.
Inorder וPreorder אנחנו יודעים את ההליכותb,c,d עץ-לתת
:Tכיוון שהן ההליכות המושרות מ
a
a
bb
c,d,b
c,dc
d
Inorder: c,d,b.
h,g,j,e,f
h,g,j,e,f
h,g,j,e,f
Preorder: b,c,d.
3 תרגיל
Preorder מההליכותT שחזרו את העץ הבינארי
: הנתונות שלוInorder ו
Inorder: c,d,b,a,h,g,j,e,f.
a
Inorder: h,g,j,e,f. Preorder: e,g,h,j,f.
h,g,j,e,f
ee
bbb
h,g,j
g
ccc
d
dd
Preorder: a,b,c,d,e,g,h,j,f.
h
ff
j
תרגיל 3
שחזרו את העץ הבינארי 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ניתן לשחזר את העץ.
אחת הדרכים להוכיח טענה זו היא ע"י שימוש בתהליך בו
השתמשנו לפתרון התרגיל.
תרגיל 4
• האם תמיד ניתן לשחזר עץ בינארי מהליכות
ה Preorderוה Postorderשלו?
– הוכיחו את הטענה או תנו דוגמא נגדית
פתרון :לא תמיד
דוגמאPostorder: BA Preorder: AB :
ישנן שתי אפשרויות לעץ:
תרגיל 1
• לעץ בינארי Tנגדיר
– ) – L(Tמספר העלים בעץ T
– ) – D2(Tמספר הקודקודים ב Tעם דרגה 2( 2ילדים בדיוק)
הוכיחו שבכל עץ בינארי Tעם nקודקודים מתקיים
D2(T)=L(T)-1
הערה :בעץ בינארי מלא ) (Fullמספר העלים הוא מספר
הקודקודים הפנימיים 1 +
פתרון:
הוכחה באינדוקציה על מספר הקודקודים בעץ .מקרה
בסיסD2(T)=0 ,L(T)=1 ,n=1 :
תרגיל 1
הוכחה באינדוקציה על מספר הקודקודים בעץ.
• צעד האינדוקציה :נניח שהטענה נכונה לכל k<n
• נסתכל על השורש בעץ עם nקודקודים
– 2מקרים אפשריים:
מקרה ראשון :דרגת השורש היא .1
.1ל Tול T1יש אותו מספר עלים
.2ל Tול T1יש אותו מספר קודקודים עם דרגה 2
𝐷2(𝑇) = 𝐷2(𝑇1) = 𝐿(𝑇1) – 1 = 𝐿(𝑇) – 1
T1
1
הנחת
האינדוקציה
2
תרגיל 1
הוכחה באינדוקציה על מספר הקודקודים בעץ.
• צעד האינדוקציה :נניח שהטענה נכונה לכל k<n
• נסתכל על השורש בעץ עם nקודקודים
– 2מקרים אפשריים:
מקרה שני :דרגת השורש היא .2
.1מספר העלים ב Tהוא סכום העלים ב T1וב T2
.2מספר הקודקים עם דרגה 2ב Tהוא סכום הקודקודים
עם דרגה 2ב T1וב T2ועוד קודקוד ( 1השורש)
T2
T1
ע "פ 2
= 𝐿(𝑇) – 1
ע "פ 1
𝐷 2 𝑇 = 𝐷 2 𝑇1 + 𝐷 2 𝑇2 + 1
= 𝐿 𝑇1 − 1 + 𝐿 𝑇2 − 1 + 1
ע"פ הנחת
האינדוקציה
תרגיל 2
• Tעץ בינארי עם nקודקודים .לכל קודקוד xיש את השדות
הבאים:
–
–
–
–
– x.keyמספר טבעי
– x.leftמצביע לבן השמאלי
– x.rightמצביע לבן הימני
– x.valמספר טבעי לשימוש כללי (אינו בשימוש ב Tבמקור)
• נגדיר את ) maxPath(Tכסכום המקסימלי של מפתחות
במסלול (פשוט) מהשורש לעלה כלשהו.
• נגדיר ) Path(Tכמסלול כלשהו עם סכום זה.
• דוגמא:
maxPath(T)=23
Path(T) = left, left
תרגיל 2
• Tעץ בינארי עם nקודקודים .לכל קודקוד xיש את השדות
הבאים:
–
–
–
–
– x.keyמספר טבעי
– x.leftמצביע לבן השמאלי
– x.rightמצביע לבן הימני
– x.valמספר טבעי לשימוש כללי (אינו בשימוש ב Tבמקור)
• נגדיר את ) maxPath(Tכסכום המקסימלי של מפתחות
במסלול (פשוט) מהשורש לעלה כלשהו.
• נגדיר ) Path(Tכמסלול כלשהו עם סכום זה.
(aתארו אלגוריתם למציאת הערך
) maxPath(Tבזמן )O(n
(bכיצד ניתן לשנות את האלגוריתם כך
שגם ידפיס את המסלול המקסימלי?
תרגיל 2
(aתארו אלגוריתם למציאת הערך ) maxPath(Tבזמן )O(n
(bכיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול
המקסימלי?
פתרון:
(aמחשבים רקורסיבית את maxPathשל הבן השאמלי וכן את
maxPathשל הבן הימני ,ומוסיפים את המפתח של הקודקוד
למקסימלי מביניהם
{) maxPath( T
)if (T == null
return 0
))lmax = maxPath(left-sub-tree(T
))rmax = maxPath(right-sub-tree(T
)m = Max(lmax, rmax
return m + T.key
}
2 תרגיל
O(n) בזמןmaxPath(T) ( תארו אלגוריתם למציאת הערךa
( כיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלולb
?המקסימלי
:פתרון
אם0 לx.val רק שנעדכן את, כמו קודםmaxPath ( נחשב אתb
. אם מהשמאלי1עץ השמאלי ו-הסכום המקסימלי בא מתת
להחליט לאיזה כיווןx.val בהדפסת המסלול נשתמש בערך
.להמשיך
maxPath( T ){
if (T == null)
return 0;
lmax = maxPath(left-sub-tree(T))
rmax = maxPath(right-sub-tree(T))
m = Max(lmax, rmax)
if (m == lmax)
T.val = 0
else
T.val = 1
return m + T.key
}
PrintPath(T){
While (T.left ≠ null or T.right ≠ null )
if (T.val == 0)
print("left ")
T = T.left
else
print("right ")
T = T.right
}
תרגיל 2
(aתארו אלגוריתם למציאת הערך ) maxPath(Tבזמן )O(n
(bכיצד ניתן לשנות את האלגוריתם כך שגם ידפיס את המסלול
המקסימלי?
ניתוח זמן:
(aמבקרים בכל קודקוד פעם אחת ,לכן זמן הריצה )O(n
(bמבקרים פעם אחת בכל קודקוד במסלול ,ומספר הקודקודים
במסלול חסום ע"י .nלכן סה"כ )O(n
– עץ חיפוש בינאריBinary Search Tree
BST
property
In a BST T, for any node x in T:
1. If y is a node in the left sub-tree of x then
key(y) < key(x).
2. if y is a node in the right sub-tree of x then
key(y) ≥ key(x).
Minimal
key
The key of the leftmost node.
Maximal
key
The key of the rightmost node.
– עץ חיפוש בינאריBinary Search Tree
Predecessor x is a node in a BST T.
The predecessor of x is the node preceding x in an in-order traversal on T.
If x has left son the maximum in the left sub-tree of x.
Otherwise, predecessor is the lowest ancestor of x whose
right child is also ancestor of x.
Successor
x is a node in a BST T.
The successor of x is the node which succeeds x in an in-order traversal on T.
If x has right son the minimum in the right sub-tree of x.
Otherwise, successor is the lowest ancestor of x whose left
child is also ancestor of x.
– עץ חיפוש בינאריBinary Search Tree
Delete
Delete node x from a BST T:
If x is a leaf and the left child of his parent ← x.parent.left = null
If x is a leaf and the right child of his parent ← x.parent.right = null
If x has only one child, update x.parent to point to x's child instead of x.
update the parent of the child of x to be the former parent of x
If x has 2 children, replace x in node y, it's successor (y has no left son)
Note that y might have right son. If so, then apply the same process of
deleting a node with only one child to y.(see previous section)
– Binary Search Treeעץ חיפוש בינארי
הדגמת מחיקות מעץ חיפוש בינארי:
15
20
8
3
12
23
10
13
11
– Binary Search Treeעץ חיפוש בינארי
הדגמת מחיקות מעץ חיפוש בינארי:
15
20
8
3
12
23
10
13
11
תרגיל 5
נתון T BSTבגודל ,nבו לכל קודקוד xיש שדה נוסף של x.size
– מספר המפתחות של תת-העץ של ( xכולל xעצמו)
הציעו אלגוריתם בזמן )( O(hכאשר hגובה העץ) למימוש
) – Greater(T,kמציאת מספר המפתחות שממש גדולים מk
הדגמהk = 10 :
key=15
הקודקוד
size= 36
Greater(T,k)=15+1+4=20
key=20
size= 15
כל תת-העץ
key=8
size= 20
כל תת-העץ
key=10
size= 8
key=12
size= 4
key=4
size= 11
תרגיל 5
נתון T BSTבגודל ,nבו לכל קודקוד xיש שדה נוסף של x.size
– מספר המפתחות של תת-העץ של ( xכולל xעצמו)
הציעו אלגוריתם בזמן )( O(hכאשר hגובה העץ) למימוש
) – Greater(T,kמציאת מספר המפתחות שממש גדולים מk
)Greater(T, k
פתרון:
keys = 0
זמן ריצהO(h) :
) while (T != Null
)if (k < T.key
הערה h=O(n) :במקרה הגרוע
keys ← keys + T.right.size + 1
T = T.left
ביותר ,ו) O(lognבמקרה הממוצע
)else if (k > T.key
T = T.right
{*} else // k = T.key
keys ← keys + T.right.size
;break
return keys
תרגיל 6
נתון עץ חיפוש בינארי Tעם גובה hשמכיל קודקוד
עם ערך aוקודקוד עם ערך .bמצאו אלגוריתם
שמחזיר את כל המפתחות בטווח ] )a<b( [a,bבזמן
) ,O(h+kכאשר kמספר המפתחות בטווח.
x
b
a
6 תרגיל
:פתרון
• Range(a, b)
1.
2.
3.
4.
Find nodes containing a and b in the tree, let Pa and Pb be the
search path from the root to a and b respectively.
Let x be the node where Pa and Pb split.
For every node v in the search path from a to x do:
if (a < v){
print v;
inorder(v.right);
}
For every node v in the search path from x to b do:
if (b > v){
inorder(v.left);
x
print v;
}
b
a
תרגיל 7
• נתונים שני עצי חיפוש בינאריים T1ו T2עם גבהים h1וh2
בהתאמה ( h1ו h2נתונים).
• נתון בנוסף שכל הערכים ב T1קטנים ממש מכל הערכים
ב .T2הניחו שכל ערכי המפתחות שונים.
.1כיצד ניתן לאחד את שני העצים לעץ אחד המכיל את איחוד
הערכים בזמן )) ,O(min(h1,h2כך שגובה עץ האיחוד יהיה
))?O(max(h1,h2
.2מה יהיה גובה עץ האיחוד?
7 תרגיל
כיצד ניתן לאחד את שני העצים לעץ אחד המכיל את איחוד.1
כך שגובה עץ האיחוד יהיה,O(min(h1,h2)) הערכים בזמן
?O(max(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.
T1
max(T1)
T2
7 תרגיל
כיצד ניתן לאחד את שני העצים לעץ אחד המכיל את איחוד.1
כך שגובה עץ האיחוד יהיה,O(min(h1,h2)) הערכים בזמן
?O(max(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.
v.left ← T1
v.right ← T2
v is the root of the new merged tree.
T2
T1
min(T2)
תרגיל 7
.2מה יהיה גובה עץ האיחוד?
פתרוןmax(h1,h2)+1 :
תרגיל 8
• מצאו אלגוריתם הבודק אם עץ בינארי נתון Tהוא
.BST
– הניחו שכל הערכים הינם מספרים שלמים שונים זה מזה
– הניחו שלכל קודקוד יש מצביע לשני הילדים אך לא
מצביע להורה.
פתרון (שגוי):
נבדוק בכל קודקוד בצורה רקורסיבית שערך הבן השמאלי
קטן יותר מהערך הנוכחי וערך הבן הימני גדול יותר מהערך
הנוכחי.
פתרון זה אינו מספיק – מצאו דוגמא נגדית
תרגיל 8
פתרון (שגוי):
נבדוק בכל קודקוד בצורה רקורסיבית שערך הבן השמאלי
קטן יותר מהערך הנוכחי וערך הבן הימני גדול יותר מהערך
הנוכחי.
פתרון זה אינו מספיק – מצאו דוגמא נגדית
15
8
20
8 תרגיל
:)פתרון (מתוקן
נשתמש בפונקציית עזר ששומרת את הגבולות העליונים והתחתונים
העץ-של הערכים המורשים בתת
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))
return false
if (curr.right != null && !isValidHelper(curr.right, curr.value, max))
return false
return true
}
.O(n) זמן הריצה הינו
. ובדיקה שהיא ממוינתInorderפתרון אפשרי נוסף הוא מציאת הליכת ה
.O(n) זמן ריצה
שאלות נוספות )אם יש זמן(
• הוכיחו או הפריכו את הטענות הבאות
– הקודקוד הראשון בסדר הליכת Preorderהוא הקודקוד
האחרון בסדר הליכת .Postorder
– הקודקוד במיקום ה iבסדר הליכת Preorderהוא
הקודקוד במיקום ה ) (n+1-iבסדר הליכת .Postorder
– לכל קודקוד vבמסלול הארוך ביותר מהשורש לעלה
בעץ Tמתקיים )Height(v)+Depth(v)=Height(T
– בעץ חיפוש בינארי ,אם לשורש יש שני ילדים ,אז
המסלול של maxPathעובר דרך הבן הימני.
– בעץ חיפוש בינארי תמיד ניתן לשחזר את העץ מידיעת
סדר הליכת ה Preorderבלבד.