binary search trees l.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Binary Search Trees PowerPoint Presentation
Download Presentation
Binary Search Trees

Loading in 2 Seconds...

play fullscreen
1 / 63

Binary Search Trees - PowerPoint PPT Presentation


  • 218 Views
  • Uploaded on

Binary Search Trees. ساختمان داده ها و الگوريتم ها. 26. 200. 28. 190. 213. 18. 12. 24. 27. درخت دودويي Binary Trees. تعريف بازگشتي درخت تهي، درختي دودويي است گرهي که فرزندان آن، دو درختچه باشند، درختي دودويي است

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Binary Search Trees' - brier


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
binary search trees

Binary Search Trees

ساختمان داده ها و الگوريتم ها

binary trees

26

200

28

190

213

18

12

24

27

درخت دودويي Binary Trees
  • تعريف بازگشتي
    • درخت تهي، درختي دودويي است
    • گرهي که فرزندان آن، دو درختچه باشند، درختي دودويي است
    • درختي دودويي است که با شروع از 1 و با اعمال 2، به تعداد متناهي بتوان آن را ساخت.

56

اين درخت دو دويي است ؟

slide3
پيمايش درخت دودويي
  • پيمايش درخت: انجام يک عمل ( مثل چاپ مقدار) بر روي گرههاي درخت
    • بازگشتي Recursive
    • تکراري Iterative
  • پيمايش بازگشتي: پردازش گره و درختچه هاي (فرزندان) چپ و راست آن
    • Inorder: 1-فرزند سمت چپ، 2-ريشه ، 3- فرزند سمت راست
    • Preorder: 1- ريشه، 2- فرزند سمت چپ، 3- فرزند سمت راست
    • Postorder:1-فرزند سمت چپ، 2- فرزند سمت راست، 3- ريشه
slide4
محاسبه عبارتهاي جبري
  • (a + b) * (c + d) + e – f/g*h + 3.25
  • هر عبارت متشكل از سه نوع عضو زير است:
  • عملگر:‌.Operators (+, -, /, *).
  • عملوند ها
    • Operands (a, b, c, d, e, f, g, h, 3.25, (a + b), (c + d),etc.).
    • علايم ويژه دسته بندي :‌ Delimiters ((, )).
slide5
درجه يك عملگر
  • تعداد عملوندهايي كه يك عملگر نياز دارد
    • عملگر مثل يك تابع و عملوند، آرگومان تابع است
    • عملگرهاي دوتايي، دو عملوند نياز دارند
    • a + b
    • c / d
    • e - f
    • عملگرهاي يكاني، يك عملوند نياز دارند
      • + g
      • - h
  • نمايش عبارتهاي جبري
    • نمايش ميانوندي
    • نمايش پيشوندي
    • نمايش پسوندي
slide6
نمايش ميانوندي
  • عملوند بين دو عملگر قرار مي گيرد
    • a * b
    • a + b * c
    • a * b / c
    • (a + b) * (c + d) + e – f/g*h + 3.25
  • ترتيب و الويت عملگرها
    • براي تفسير درست عبارت لازم است
    • عمليات ضرب و تقسيم بر جمع و تفريق مقدم هستند
    • از چپ به راست است
slide7
علايم دسته بندي
  • با استفاده از اين علايم، عبارتهايي ساخته مي شوند كه در عبارات بزرگتر مثل يك عملوند بكار مي روند:
    • (a + b) * (c – d) / (e – f)
slide8
براي محاسبه عبارتهاي جبري به علايم دسته بندي، اوليت بندي عملگرها نياز است

براي محاسبه آنها برنامه پيچيده اي نياز داريم

نمايش پيشوندي و پسوندي چنين ملزوماتي ندارند

محاسبه عبارات به شكل پسوندي يا پيشوندي براي كامپيوتر راحتتر است

نمايش پسوندي Postfix

نمايش پسوندي يك عملگر دوتايي با دو عملوند به صورت زير است:

A o B = AB o ,

o is the operator

نمايش پيشوندي يك عملگر دوديي چنين است:

A o B = oAB ,

o is the operator

محاسبه عبارت
slide9
چند نمونه عبارت پسوندي
  • Infix = a + b * c
    • Postfix =

a

b

c

*

+

  • Infix = a * b + c
    • Postfix =

a

b

*

c

+

  • Infix = (a + b) * (c – d) / (e + f)
    • Postfix =

a

b

+

c

d

-

*

e

f

+

/

slide10
عملگرهاي يكاني
  • براي خوانايي عبارت از علايمي ديگر براي عملگرهاي يكاني استفاده مي كنيم
    • + a => a @
    • + a + b => a @ b +
    • - a => a ?
    • - a-b => a ? b -
postfix evaluation
Postfix Evaluation
  • عبارت را از چپ به راست مي خوانيم و به هر عملوند كه مي رسيم آن را در پشته يادداشت مي كنيم
  • با رسيدن به عملگر به تعداد لازم عملوند از پشته بر مي داريم و عمل خواسته شده را انجام مي دهيم و سپس نتيجه محاسبه را در پشته يادداشت مي كنيم
  • نتيجه نهايي عبارت در بالاي پشته قرار دارد
postfix evaluation12

stack

Postfix Evaluation
  • (a + b) * (c – d) / (e + f)
  • a b + c d - * e f + /
  • a b + c d - * e f + /
  • b + c d - * e f + /
  • + c d - * e f + /

b

a

postfix evaluation13

stack

Postfix Evaluation
  • (a + b) * (c – d) / (e + f)
  • a b + c d - * e f + /
  • a b + c d - * e f + /

d

c

  • c d - * e f + /

(a + b)

  • d - * e f + /
  • - * e f + /
postfix evaluation14

stack

Postfix Evaluation
  • (a + b) * (c – d) / (e + f)
  • a b + c d - * e f + /
  • * e f + /

(c – d)

(a + b)

postfix evaluation15
Postfix Evaluation
  • (a + b) * (c – d) / (e + f)
  • ab + c d - * e f + /
  • a b+ c d - * e f + /
  • a b+ c d - * e f + /
  • a b+ c d - * ef + /

f

e

  • a b+ c d - * ef+ /

(a + b)*(c – d)

stack

postfix evaluation16
Postfix Evaluation
  • (a + b) * (c – d) / (e + f)
  • a b + c d - * e f + /
  • a b + c d - * e f + /
  • a b + c d - * e f + /
  • a b + c d - * e f + /

(e + f)

  • a b + c d - * e f + /
  • a b + c d - * e f + /

(a + b)*(c – d)

stack

slide18

/

/

*

+

e

f

+

-

a

b

c

d

نمايش يك عبارت با درخت دودويي
  • (a + b) * (c – d) / (e + f)
slide19

+

a

b

-

c

d

+

e

f

*

/

مزاياي نمايش با درخت
  • عملوندهاي راست و چپ را براحتي مي توان نشان داد
  • با الگوريتم هاي بازگشتي براحتي مي توان عبارات را محاسبه كرد
slide20
پيمايش درخت : ملاقات گرههاي آن

هر گره را فقط يكبار مي بينيم

هنگام ديدن يك گره عمل خواسته شده را روي آن انجام مي دهيم

Preorder

Inorder

Postorder

Level order

پيمايش درخت
slide21
public static void preOrder(BinaryTreeNode t)

{

if (t != null)

{

visit(t);

preOrder(t.leftChild);

preOrder(t.rightChild);

}

}

پيمايش پيش ترتيب
preorder of expression tree

/

*

+

e

f

+

-

a

b

c

d

Preorder Of Expression Tree

/

*

+

a

b

-

c

d

+

e

f

Gives prefix form of expression!

inorder traversal
public static void inOrder(BinaryTreeNode t)

{

if (t != null)

{

inOrder(t.leftChild);

visit(t);

inOrder(t.rightChild);

}

}

Inorder Traversal
inorder of expression tree

/

*

+

e

f

+

-

a

b

c

d

a

+

b

*

c

-

d

/

e

+

f

Inorder Of Expression Tree

پيمايش ميان ترتيب، عبارت ميانوند را بدون پرانتز مي دهد

postorder traversal
public static void postOrder(BinaryTreeNode t)

{

if (t != null)

{

postOrder(t.leftChild);

postOrder(t.rightChild);

visit(t);

}

}

Postorder Traversal
postorder of expression tree

/

*

+

e

f

+

-

a

b

c

d

Postorder Of Expression Tree

a

b

+

c

d

-

*

e

f

+

/

Gives postfix form of expression!

traversal applications

a

b

c

f

e

d

j

g

h

i

Traversal Applications
  • Make a clone.
  • Determine height.
  • Determine number of nodes.
level order
Let t be the tree root.

while (t != null)

{

visit t and put its children on a FIFO queue;

remove a node from the FIFO queue and call it t;

// remove returns null when queue is empty

}

Level Order
slide37
فرض كنيد اعضاي درخت غير تكراري هستند

آيا با داشتن يكي از پيمايشها، مي توان درخت را ساخت!؟

اگر پيمايش داده شده بيش از يك عضو داشته باشد؛ نمي توان درخت را به صورت منحصر بفرد ساخت

آيا با داشتن دو نوع پيمايش مي توان را درخت را به صورت منحصر بفرد ساخت ؟

شايد بتوانيم!

ساخت درخت دودويي
some examples
preorder = ab

a

b

a

a

a

a

b

b

b

b

a

b

a

a

b

b

Some Examples

inorder = ab

postorder = ab

level order = ab

preorder and postorder
preorder = ab

a

a

b

b

Preorder And Postorder

postorder = ba

  • Preorder and postorder do not uniquely define a binary tree.
  • Nor do preorder and level order (same example).
  • Nor do postorder and level order (same example).
inorder and preorder
inorder = g d h b e i a f j c

preorder = a b d g h e i c f j

Scan the preorder left to right using the inorder to separate left and right subtrees.

a is the root of the tree; gdhbei are in the left subtree; fjc are in the right subtree.

a

gdhbei

fjc

Inorder And Preorder
inorder and preorder41
preorder = a b d g h e i c f j

b is the next root; gdh are in the left subtree; ei are in the right subtree.

a

a

b

fjc

gdhbei

fjc

gdh

ei

Inorder And Preorder
inorder and preorder42
preorder = ab d g h e i c f j

d is the next root; g is in the left subtree; h is in the right subtree.

a

a

b

fjc

b

fjc

d

ei

gdh

ei

g

h

Inorder And Preorder
inorder and postorder
Scan postorder from right to left using inorder to separate left and right subtrees.

inorder = g d h b e i a f j c

postorder = g h d i e b j f c a

Tree root is a; gdhbei are in left subtree; fjc are in right subtree.

Inorder And Postorder
inorder and level order
Scan level order from left to right using inorder to separate left and right subtrees.

inorder = g d h b e i a f j c

level order = a b c d e f g h i j

Tree root is a; gdhbei are in left subtree; fjc are in right subtree.

Inorder And Level Order
slide45
درخت جستجويي دو دويي = Binary Search Tree (BST)

ساختمان داده اي ديگر براي نگهداري مجموعه هاي پوياست که عمليات زير را انجام مي دهد:

Search, Minimum, Maximum, Predecessor, Successor, Insert, and Delete.

براي ساختن Dictionary. و Priority Queue مي توان از آن استفاده کرد

زمان انجام عمليات اوليه، متناسب با عمق(ارتفاع) درخت است.O(h).

درخت جستجويي دو دويي
slide46
با استفاده از ساختار پيوندي گرهها نمايش داده مي شود

root(T): Tاشاره گر به ريشه درخت

هر گره مشخصه هاي زير را دارد:

key

left – pointer to left child: root of left subtree.

right – pointer to right child : root of right subtree.

p – pointer to parent. p[root[T]] = NIL (optional).

نمايشBST
slide47
مشخصه کليد (key) بايد اين خواص را داشته باشد

y in left subtree of x, then key[y]  key[x].

y in right subtree of x, then key[y]  key[x].

26

200

28

190

213

18

12

24

27

خواص BST

56

inorder

26

200

28

190

213

18

12

24

27

پيمايشInorder

با استفاد از خاصيت BST مي توان مقادير درخت را به صورت صعودي يکنوا نشان داد

Inorder-Tree-Walk (x)

1. ifx NIL

2. then Inorder-Tree-Walk(left[p])

3. print key[x]

4. Inorder-Tree-Walk(right[p])

56

12

18

24

26

27

28

56

190

210

213

  • هزينه پيمايش چقدر است ؟
inorder49
درستي پيمايش Inorder
  • اثبات: درستي و پايان پذيري
    • با استفاده از استقراء رياضي: پيمايش درخت سمت چپ و راست به درست انجام مي شود
  • اگر درخت تهي باشد، درستي و پايان پذيري بديهي است
  • اگر درخت بيش از يک گره باشد
    • درختچه سمت چپ - با استفاده از استقراء - چاپ مي شود
    • ريشه چاپ مي شود؛ با تکيه بر خاصيت BST‌ مقدار ريشه از مقادير درختچه سمت چپ بزرگتر است بنابراين در جايگاه خود چاپ مي شود
    • درخت سمت راست نيز بنابر استقراء بدرستي چاپ مي شود و مقادير آن از مقدار ريشه بزرگترند
slide50
جستجو در BST
  • کليه عمليات مجموعه هاي پويا را مي توان با هزينه اي متناسب با عمق درخت انجام دادO(h).
  • اگر درخت متوازن باشد( عمق درختچه هاي سمت چپو راست نزديک هم باشد) h = (lg n)
  • در بدترين حالت: h =(n).
    • درخت دودويي به صورت زنجيره اي از گرهها در مي آيد
tree search
Tree Search

Tree-Search(x, k)

1. ifx =NIL or k = key[x]

2. then return x

3. ifk <key[x]

4. then return Tree-Search(left[x], k)

5. else return Tree-Search(right[x], k)

Running time: O(h)

Aside: tail-recursion

iterative

26

200

28

190

213

18

12

24

27

جستجوي تکراري Iterative

Iterative-Tree-Search(x, k)

1. whilex  NILandk  key[x]

2. doifk <key[x]

3. thenx left[x]

4. elsex right[x]

5. returnx

Search 24

56

جستجوي دوديي به صورت تکراري، کاراتر از روش بازگشتي است؛ اما پياده سازي روش بازگشتي سريعتر و ساده تر است

min max
يافتن Min , Max
  • ساختارBST تضمين مي کند:
    • MIN در سمت چپ ترين گره قرار مي گيرد
    • MAX در سمت راست ترين گره قرار مي گيرد.

Tree-Minimum(x)Tree-Maximum(x)

1. whileleft[x] NIL 1. whileright[x] NIL

2. dox left[x] 2. dox right[x]

3. returnx 3. returnx

هزينه اين عمليات چقدر است ؟

predecessor successor
Predecessor & Successor
  • Successor (x) گره بعد از x: گرهي که مقدار آن از مقدار x‌ بزرگتر ولي از ديگر کليدهاي بزرگتر از x ، کوچکتر است
    • کوچکترين کران بالا
    • گرهي که هنگام پيمايش inorder، بلافاصله بعد از x‌ ظاهر مي شود
  • Predecessor(x) گره قبل از x: گرهي که مقدار آن از کليد x‌ کوچکتر ولي از ديگر کليدهاي کوچکتر ازx ، بزرگتر است
    • بزرگترين کران پايين
    • گرهي که هنگام پيمايش inorder، بلافاصله قبل از x‌ ظاهر مي شود
successor

26

200

28

190

213

18

56

12

24

27

شبه کد Successor

Tree-Successor(x)

  • if right[x] NIL

2. then return Tree-Minimum(right[x])

3. yp[x]

4. whiley  NIL and x = right[y]

5. dox y

6. yp[y]

7. returny

Successor (28)

y

x

Code for predecessor is symmetric.

Running time:O(h)

slide56
Tree-Insert(T, z)

y NIL

x  root[T]

whilex  NIL

doy  x

ifkey[z] < key[x]

thenx  left[x]

elsex  right[x]

p[z]  y

if y = NIL

thenroot[t]  z

elseifkey[z] < key[y]

then left[y]  z

elseright[y]  z

عمل افزودن بايد چنان انجام شود که خاصيت BST حفظ شود

مثال: افزودن 50 به درخت زير

26

200

56

28

190

213

18

12

24

27

افزودن يک گره به درخت

50

slide57
Initialization:O(1)

While loop in lines 3-7 searches for place to insert z, maintaining parent y.O(h) time.

Lines 8-13 insert the value: O(1)

 TOTAL: O(h) time to insert a node.

آناليز افزودن گره

Tree-Insert(T, z)

  • y NIL
  • x  root[T]
  • whilex  NIL
  • doy  x
  • ifkey[z] < key[x]
  • thenx  left[x]
  • elsex  right[x]
  • p[z]  y
  • if y = NIL
  • thenroot[t]  z
  • elseifkey[z] < key[y]
  • then left[y]  z
  • elseright[y]  z
tree delete t x

26

200

190

190

213

213

12

12

24

24

Tree-Delete (T, x)

ifx has no children then remove x case 0

ifx has one child then point p[x] to child  case 1

ifx has two children (subtrees) then  case 2

swap x with its successor

perform case 0 or case 1

Delete 26

Delete 28

56

56

26

200

28

28

18

18

27

27

successor59

26

200

28

190

213

18

56

12

24

27

شبه کد Successor

Tree-Successor(x)

  • if right[x] NIL

2. then return Tree-Minimum(right[x])

3. yp[x]

4. whiley  NIL and x = right[y]

5. dox y

6. yp[y]

7. returny

Successor (28)

y

x

Code for predecessor is symmetric.

Running time:O(h)

slide60
شبه کد حذف

Tree-Delete(T, z)

/* Determine which node to splice out: either z or z’s successor. */

  • if left[z] = NIL or right[z] = NIL
  • theny  z
  • elsey  Tree-Successor[z]

/* Set x to a non-NIL child of x, or to NIL if y has no children. */

  • ifleft[y]  NIL
  • then x  left[y]
  • elsex  right[y]

/* y is removed from the tree by manipulating pointers of p[y] and x */

  • if x  NIL
  • thenp[x]  p[y]

/* Continued on next slide */

slide61
شبه کد حذف يک گره

Tree-Delete(T, z) (Contd. from previous slide)

  • if p[y] = NIL
  • thenroot[T]  x
  • else if y = left[p[i]]
  • then left[p[y]]  x
  • else right[p[y]]  x

/* If z’s successor was spliced out, copy its data into z */

  • ify  z
  • then key[z]  key[y]
  • copy y’s satellite data into z.
  • returny
slide62
درستي الگوريتم حذف
  • در حالت دوم، اجراي الگوريتم به حالت 0 يا 1 منتقل مي شود؛ زيرا:
    • اگر x دو فرزند داشته باشد، گره بعدي آن، کوچکترين گره درختچه سمت راست خواهد بود. اين گره فرزند سمت چپ ندارد. اگر فرزند راست داشته باشد، حالت 0 و اگر نداشته باشد حالت 1 اتفاق مي افتد
  • در اين الگوريتم مي توان از گره قبل نيز استفاده کرد. بهتر است هنگام حذف گره يکي از گرههاي قبل و بعد بصورت تصادفي انتخاب شود تا شانس توليد درخت نامتوازن کاهش يابد.
slide63
تمرين
  • شبه کد زير براي مرتب سازي بوسيله BST نوشته شده است. هزينه اجراي آن را در بدترين، متوسط و بهترين حالت محاسبه کنيد
  • ارزيابي شما از کارايي اين الگوريتم در مقايسه با ديگر روشهاي مرتب سازي چيست ؟

Sort (A)

for i 1 to n

do tree-insert(A[i])

inorder-tree-walk(root)