38
םםםםםם םםםםם םםםםם םםםםםם –Linked List םםםםםםLinkedList םםםםםםLink םםםםם םםםםם םםםםםם םםםםםםםםםםםםם? םםםםםםArray vs. LinkedList Iterator םםםםםIterable םםםםםIterator Queue isEmpty, dequeue, enqueue FIFO Stack isEmpty, push, pop LIFO 1

בתרגול הקודם

  • 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

Tirgul 13:Trees

2

הגדרות

. עץ• מורכב – עץ היררכי מבנה של מופשט מודל . - ) בן ) אבא יחס עם קודקודים צמתים של מאוסף

. בעץ שורש• בדיוק – יש עץ בכל אבא ללא צומת . בדיוק יש לשורש פרט הצמתים לכל אחד שורש

. אחד אב3

הגדרות

קדמון הינו Xצומת • צומת אב צאצאהנו Yו, Yשלאל Xשל מהשורש המסלול דרך Yאם .Xעובר

ה Xצומת • Xאם Xשל בןהנו Wו, Wשל אבאהנושל קדמון אב .Wהנו צלע ביניהם ויש

Y

X

W

4

קדמון אבצאצאאבאבן

הגדרות

.עלה• בנים – לו אין אשר צומת

בעץ עומק• צומת הצומת = של מרחקמהשורש.

5

הגדרותעץ גובה• בעץ – של צומת של מקסימאלי עומק

הוא) ריק עץ של (.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

עץ: מימוש

11

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

מימוש:בינארי - חיפוש BSTעץ

BST

BinaryTree

BSN

BinaryNode

הורשה

17

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 Insert: Example

• Example: Insert C

F

B H

KDA

C

25

לעץ חדש איבר הכנסה: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העץ

ממבחן דוגמא

28

' א 2011מועד

29

30

BinaryTreeבמחלקה

BinaryNodeבמחלקה

31

מלא בינארי (FULL) עץ

צומת לכל בו אשר בינארי עץ ) בנים ) שני בדיוק יש מלאעץ בינארי .פנימי

32

מושלם בינארי (PERFECT) עץ

שבו מלא בינארי עץאותו יש העלים לכל

.עומק

מושלםעץ בינארי

33

שלם בינארי (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

The End!

39