question 1
p<- new skiplist
p1<- s1.first
p2<- s2.first
while (p1!=null) and (p2!=null)
x<- min(p1, p2)// P2 P1 מקבל מצביע למינימום מבין
//אם ערכי המצביעים שווים אז מחזיא את המצביע אם המגדל הכי גדול ומקדם את
//המצביע שמוחזר אם הם שווים מקדם את שניהם
link <- p.insert(x.value) //
build_tower(link, x) //
if (p1!=null)
temp<-p1
else
temp<-p2
while (temp=null)
duplicate remaining list(p,temp)
question 4
מבנה הנתונים יהיה עץ בינארי שיכיל פרט לתוכן התא גם שדה שאומר כמה צמתים יש
משמאל התא
Element(i)
root.element(i,0)
Element(i, smaller)
if (smaller + this.smaller = i-1)//there is i-1 elements smaller
return data
if (smaller+this. smaller<i-1)//there is no i-1 elements smaller
return right.element(i, smaller +this. smaller+1)
if (smaller+this. smaller>i-1)//there is more than i-1 element smaller
return left.element(i, smaller)
insert(a)
if empty_tree
root <- create node(a, 0)
else
root.insert(a)
insert(a)
if a> data
if right = null //creating the node
right <- create node (a,0)
else
right.insert(a, 0)//call recursively to the method
else
if left = null
left <- create node (a, 0)
smaller <- 1
else //call recursively to the method
smaller--
left.insert(a)
Delete(i)
p <- find(i)
f <- p.father
if f.left = p
if p is leaf
f.smaller <- 0
f.left <- null
else
if p has one sun
f. smaller <- 1
f.left <- p.sun // left or right
else
r<-find most right (p)
p.data <- r.data
erase r
update_up(this)
if p is a leaf or has one sun
erase p
else
l<-find most left (p)
p.data <- l.data
erase l
update_up(l)
average(x1,x2)
את נקודתZ נציין בElement לפי אותו האלגוריתם בx2 ולx1 נמצא את המסלול ל
ונסכם את כלx2 נמשיך בסלול עד לZ ההתפצלות של המסלול ואז בפנייה ימינה מ
האיברים עד אליו ואת כל האיברים בתתי העץ השמאליים עד אליו כמו כן נספור את כל
באותה צורה נפנה שמאלה.התאים עד אליו ואת כל התאים בתתי העצים השמאליים
ונסכם את כל האיברים עד אליו ואת כל האיברים בתתי העצים הימנייםx2 במסלול עד ל
בסוף נסכם את הסכומים משני הצדדים ונחלק במספר.כמו כן נספור גם את כמות האיברים
האיברים משני הצדדים וכך קיבלנו ממוצע
B.
insert (a)
s<-create stack
start.insert(a, s)
insert(a,s)
while this.next < a //find where a should be
this <- this.next
while this.below != null //go down
s.push(this)
this <- this.below
while this.next < a //find where a should be
this <- this.next
next <- this.next.next
this.next <- create element(a, next)//second parameter for next
//pointer
while random > 0.5 //randomize number 50 precent chance
up <- s.pop
next <- up.next.next
up.next <- create element (a, next, this. next)//third
//parameter for below
this <- up//update this to be upper element
delete (a)
while this.next < a
this <- this.next
while this.below != null
if this.next = a//find the element a
s.push(this)//insert the element into the stack
this <- this.below
while this.next < a
this <- this.next
while (!s.is_empty)//iteratively erase all the element in the tower
this <- s.pop
next <- this.next.next
this.next <- next
Question 5
(Rearrange(T1, T2
אזT1 =! NULL אם
T2 בT1 מצא את השורש של
(* מוסבר למטה,והעלה אותו לשורש ראשי )בבעבוע
(Rearrange (T1.left, T2.left
(Rearrange (T1.right, T2.right
מצביעים לצמתיםT1, T2 כאשר//
•בעבוע
: בצעX =! T1 כל
2T -> X בT1 נחפש את השורש
' למעלה לפי מקרים א' או בX העלה את
'מקרה ב 'מקרה א
Qusetion 6
pred(x)
x<-search(k)
// אמור להיותK נמצא בו או איפה שK מחזיר מצביע ש
if x is a leaf
if x has left sibling
return x.leftsibiling
else
if x has left parent
return x.left_parent
else
return strictly_left_up_parent
else
rightest_lowest_sun(x.leftsun)
rightest_lowest_sun(x)
if x is leaf
if x has rightsibling
return x.rightestsibling
else
return x
else
return rightest_lowest_sun(x.rightest_sibling)
strictly_left_up_parent(x)
while(x.parent don’t have left sibling)
x<-x.parent
return left node //the left node that x is his right sun
greater(k)
h<-tree height // return tree height O(log n)
x<-root // points to the leftmost sun in level zero
i<-0
sval_max<-0
sval_min<-0
while(k!=x.value)
while(x.next!=null and x.next.value<k)
x<-x.next
sval_max<-sval_max+max(h-i)
sval_min<-sval_min+min(h-i)
I if (x!=k and x.right!=null)
x<-x.rigth_sun
i++
upperbound<-max_number_of_sun_in_level_zero * max(h)-sval_min
lowerbound<-min_number_of_sun_in_level_zero*min(h)sval_max
)ValueAt(i
)return root.valueAt(i,0
)valueAt(Index, j
k<-0
j<-j+A[k].size_of_left_sun
)while (j<index
k++
j<-j+1+A[k].size_of_left_sun
)if (j=i-1
return A[k].key
else
;)retuen A[k].left_sun.ValueAt(index, j
Qusetion 7
OBJמכיל את השדות:
()Init
מאתחל את שני העצים ,ואת כל השתנים להיות אפס.
(Insert(x
בניית האובייקט OBJעבור (X ((1)O
הכנסת Xלעץ הראשון )) ,(O)lognהכנסה של OBJלעץ 2
(Delete(x
חיפוש Xבעץ מס ) 1ומציאת מצביע מתאים לעץ ,(2מחיקה של ה OBJ
המתאים .מחיקה של .X
)העצים הם עצי AVLולכן כל החיפוש +מחיקה ))(O(longn
(Delete_By_Index(i
חיפוש iבעץ מס ) 2ומציאת מצביע לאיבר התאים בעץ ,(1מחיקה מעץ .1מחיקה
מעץ ) .2מאותם סיבות גם זה ((O(logn
(Get_Index(x
חיפוש בעץ מס 1לפי ) ,Xומציאת מצביע לאיבר מתאים בעץ מס (2
אם Xזוגי החזר את even_Indexאם Xא"ז החזר את odd_index
(Average(x1, x2
נבדוק את המסלולים של x1, x2ונסמן את נקודת הפיתול ב .Z
נסכום את הערכים במסלול מ Zעד X1וגם של תתי העצים הימניים ובנוסף
נספור גם את מספר הצמתים שנבקר בהם וגם של תתי העצים הימניים ,באותו אופן עבור
המסלול מ Zל x2כאשר נסכום על תתי העצים השמאליים +צמתים .ונחזיר את סכום
הערכים הכולל לחלק למספר הצמתים הכולל ,וזהו הממוצע בין x1ל .x2