Upload
hisa
View
46
Download
6
Embed Size (px)
DESCRIPTION
בתרגול הקודם. רשימה מקושרת – Linked List המחלקה LinkedList המחלקה Link באיזו מחלקה ממומשת הפונקציונליות? השוואה Array vs. LinkedList Iterator הממשק Iterable הממשק Iterator Queue isEmpty , dequeue , enqueue FIFO Stack isEmpty , push , pop LIFO. Tirgul 13: Trees. הגדרות. - PowerPoint PPT Presentation
Citation preview
הקודם בתרגולמקושרת – • Linked Listרשימה
LinkedListהמחלקה –Linkהמחלקה ––? הפונקציונליות ממומשת מחלקה באיזוArray vs. LinkedListהשוואה –
•IteratorIterableהממשק –Iteratorהממשק –
•Queue–isEmpty, dequeue, enqueue–FIFO
•Stack–isEmpty, push, pop–LIFO 1
הגדרות
. עץ• מורכב – עץ היררכי מבנה של מופשט מודל . - ) בן ) אבא יחס עם קודקודים צמתים של מאוסף
. בעץ שורש• בדיוק – יש עץ בכל אבא ללא צומת . בדיוק יש לשורש פרט הצמתים לכל אחד שורש
. אחד אב3
הגדרות
קדמון הינו Xצומת • צומת אב צאצאהנו Yו, Yשלאל Xשל מהשורש המסלול דרך Yאם .Xעובר
ה Xצומת • Xאם Xשל בןהנו Wו, Wשל אבאהנושל קדמון אב .Wהנו צלע ביניהם ויש
Y
X
W
4
קדמון אבצאצאאבאבן
הגדרותעץ גובה• בעץ – של צומת של מקסימאלי עומק
הוא) ריק עץ של (.1-וגובה
בינארי • מספר - עץ בו אשר עץאינו צומת כל של הבנים
על .2עולה
6
הגדרותבינארי - חיפוש BSTעץ
, צומת כל עבור בו אשר בינארי עץהעץ בתת האיברים כל של הערכים
, ) ממנו ) שווים או קטנים שלו השמאלישלו הימני העץ בתת האיברים וכל
. ממנו גדולים
7
77
77
11
33 1010
44
66 1414
1313
עץ לסריקת שיטות שלוש
pre-order, in-order, post-order.האיברים סדר יתקבל הנתון בעץ הסריקות בביצוע
הבא:
:(pre-orderתחילי )•
:(in-orderתוכי )•
:(post-orderסופי )•
11
99
88
66 33
22
55
8
1,6,8,5,2,9,3
8,6,2,5,9,1,3
8,2,9,5,6,3,1
אם התוצאה הייתה מההיה binary searchהעץ
tree?
וקודם: עוקב הגדרות
:xלצומת העוקבהקטן המפתח בעל הצומתשל, מהערך הגדול ביותר
x
:xלצומת הקודםהגדול המפתח בעל הצומתשל, מהערך הקטן ביותר
x
דוגמה:של הוא Wהקודםשל הוא Wהעוקבשל הוא Cהקודםשל הוא Cהעוקב
סריקת, BSTב- :inOrderלפיR
9
YBE
public class BinaryTree {
protected BinaryNode root;
public BinaryTree() {root = null;
} // BinaryTree
public boolean isEmpty() {return root == null;
} // isEmpty
public void insert(Object toAdd) {if (isEmpty()) root = new BinaryNode(toAdd);else root.insert(toAdd);
} // insert
public String inOrder() {if (isEmpty()) return "";else return root.inOrder();
} // inOrder
public String preOrder() {if (isEmpty()) return "";else return root.preOrder();
} // preOrder
public String postOrder() {if (isEmpty()) return "";else return root.postOrder();
} // postOrder}
BinaryTree
12
BinaryNode
public class BinaryNode { protected Object data; protected BinaryNode left; protected BinaryNode right;
public BinaryNode(Object data) {this.data = data;left = null;right = null;
} // BinaryNode …}
public void insert(Object toAdd) { double select = Math.random(); if (select > 0.5) {
if (left == null) left = new BinaryNode(toAdd);else left.insert(toAdd);
} else {
if (right == null) right = new BinaryNode(toAdd);else right.insert(toAdd);
}} // insert
13
BinaryNode
public String inOrder() { String res = ""; if (left != null)
res = res + left.inOrder(); res = res + " " + data + " "; if (right != null)
res = res + right.inOrder(); return res;} // inOrder
public String preOrder() { String res = ""; res = res + " " + data + " "; if (left != null)
res = res + left.preOrder(); if (right != null)
res = res + right.preOrder(); return res;} // preOrder
14
BinaryNode
15
public String postOrder() { String res = ""; if (left != null)
res = res + left.postOrder(); if (right != null)
res = res + right.postOrder(); res = res + " " + data + " "; return res;} // postOrder
: עצים של לשיטות דוגמהכללי גובהחישוב בינארי בעץ
:BinaryTreeבמחלקה
public int height() { if (isEmpty())
return -1; else
return root.height();} // height
:BinaryNodeבמחלקה
public int height() { int resLeft = -1; int resRight = -1; if (left != null) {
resLeft = left.height(); } if (right != null) {
resRight = right.height(); } return Math.max(resLeft, resRight) + 1;} // height
16
18
? העץ איברי בין נשווה כיצד
לדאוג עלינו ממוין באופן בעץ האיברים את להחזיק מנת על – , בממשק נשתמש לכן השוואה בני יהיו שאיברים
Comparable.: לממשק תזכורת
public interface Comparable {public int compareTo(Object other);
}
" י ע איברים שני משווים אנו כאשר להיווצר יכולה בעייה ?compareToאיזו
19
שני • בין להשוות מעוניינים אנו לעיתים , לדוגמה נפרדות השוואות כמה לפי אובייקטים
: פי על סטודנטים בין להשוות נרצהזהות – מספרמשפחה – שם
? נעשה מה " עצמים " שני מבין מי להכריע שיידע חיצוני שופט נייצר
מחלקה "מאותה גדול " יותר
Comparator interface:
20
Comparator interface:
public interface Comparator {
int compare(Object obj1, Object obj2);
} // comparator
public class IntegerComparator implements Comparator {public int compare(Object o1, Object o2) {
if (((Integer)o1).intValue() > ((Integer)o2).intValue())return 1;
else if (((Integer)o1).intValue() == ((Integer)o2).intValue())return 0;
elsereturn -1;
}}
IntegerComparator
21
public class CharacterComparator implements Comparator {public int compare(Object o1, Object o2) {
if (((Character)o1).charValue() > ((Character)o2).charValue())return 1;
else if (((Character)o1).charValue() == ((Character)o2).charValue())return 0;
elsereturn -1;
}}
CharacterComparator
22
BST
23
import java.util.Comparator;public class BST extends BinaryTree { private Comparator comp;
public BST(Comparator comp) {super();this.comp = comp;
} // BST
… // (override insert only)
} // class BST
public class BSN extends BinaryNode { private Comparator comp;
public BSN(Object data, Comparator comp) {
super(data);this.comp = comp;
} // BSN
… // (override insert, remove, etc.)} // class BSN
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
Comparator comp = new IntegerComparator();
BST tree1 = new BST(comp);
tree1.insert(new Integer(50)); // Step 1
tree1.insert(new Integer(60)); // Step 2
tree1.insert(new Integer(40)); // Step 3
tree1.insert(new Integer(30)); // Step 4
tree1.insert(new Integer(20)); // Step 5
tree1.insert(new Integer(45)); // Step 6
tree1.insert(new Integer(65)); // Step 7
System.out.println("InOrder: " + tree1.inOrder());
System.out.println("PreOrder: " + tree1.preOrder());
System.out.println("PostOrder: " + tree1.postOrder());
System.out.println("Find Minimum: " + tree1.findMin());
System.out.println("Height: " + tree1.height());
}
} 24
50
6040
30
20
45 65
Step 1Step 2Step 3Step 4Step 5Step 6Step 7
לעץ חדש איבר הכנסה:BSTבמחלקה
public void insert(Object toAdd){ if (isEmpty()) {
root = new BSN(toAdd, this.comp); } else { root.insert(toAdd); }} // insert
:BSNבמחלקה
public void insert(Object toAdd) { if (comp.compare(toAdd, this.data) < 0) { if (left == null) left = new BSN(toAdd,this.comp); else left.insert(toAdd); } if (comp.compare(toAdd, this.data) > 0) { if (right == null) right = new BSN(toAdd,this.comp); else right.insert(toAdd); }} // insert
26
להכניס ננסה אם יקרה מהקיים שכבר איבר לעץ
בתוכו?
מינימאלי מפתח בעל קודקוד מציאתבינארי חיפוש .בעץ
:BSTבמחלקה public Object findMin() {
if (isEmpty()) {return null; // Exceptions are needed...
}return ((BSN)root).findMin();
} // findMin:BSNבמחלקה
public Object findMin() {BinaryNode t=this;while( t.left != null )
t = t.left;return t.data;
} // findMin
27
אם לעשות צריכים היינו מההיה לא ?BSTהעץ
שלם בינארי (COMPLETE) עץ
שלו הקדקודים לכלעד
h-2 שכבה בדיוק בנים 2יש
הקדקודים כלה hברמהלשמאל מרוכזים
בינארי שגובהו עץh :ומתקיים
שלםעץ בינארי
34
בינארי עץ האם בדיקהמושלם בינארי עץ הוא
:BinaryTreeבמחלקה public boolean isPerfect() {
return root.isPerfect();}
:BinaryNodeבמחלקה public boolean isPerfect() {
int h = height(); //class method if (h==0) return true; if (h==1) return ((left != null) && (right != null)); return ((left != null) && (left.height() == h - 1) &&
left.isPerfect() && (right != null) &&(right.height() == h - 1) &&
right.isPerfect());}
עץ בינארי מושלם
35
הוא בינארי עץ האם "בדיקה שלם": הבאות ההגדרות את ראינו
מושלם עומק - (perfect)עץ אותו העלים לכל שבו מלא בינארי עץ
שלם ) בינארי שגובהו (completeעץ בינארי ומתקיים hעץ
שכבה עד שלו הקדקודים h-2לכלבדיוק בנים 2יש
ה ברמה הקדקודים hכללשמאל מרוכזים
שלםעץ בינארי
36
רקורסיבית בהגדרה
ריק הואאו
עץ של שורש הוא שלו השמאלי הבןh-1בגובה שלם
עץ של שורש הוא שלו הימני והבןh-2בגובה מושלם
אועץ של שורש הוא שלו השמאלי הבן
h-1בגובה מושלם עץ של שורש הוא שלו הימני והבן
h-1בגובה שלם
בגובה בינארי :שלםהוא hעץ אם ורק אם
37
הוא העץ גובה אם כי קצה מקרי כמה נבדוק 1או 0אנחנוהוא העץ תת גובה אם לבדוק שדרוש 1או –0נקבל
:BinaryTreeבמחלקה public boolean isComplete() {
return root.isComplete();}
:BinaryNodeבמחלקה public boolean isComplete() { int h = height(); //class method if (h==0) return true; if (h==1) return ((left != null)); //the height is 2 and up: boolean has2Sons = ((left != null) && (right != null)); boolean case1=false, case2=false; if (has2Sons) { int leftH = left.height(); int rightH = right.height(); case1 = (((leftH == h-1) && left.isComplete()) && (rightH == h-2) && right.isPerfect()); case2 = (((leftH == h-1) && left.isPerfect ()) && (rightH == h-1) && right.isComplete()); } return case1 || case2;}
שלםעץ בינארי
38