درخت جستجوی دودویی
This presentation is the property of its rightful owner.
Sponsored Links
1 / 33

درخت جستجوی دودویی PowerPoint PPT Presentation


  • 153 Views
  • Uploaded on
  • Presentation posted in: General

درخت جستجوی دودویی. درخت جستجوي دودويي: درخت دودويي صفر نود يا بيشتر اگر >0 نود: هر نود داراي يک کليد يکتا است. کليد تمام نودهاي زير درخت سمت چپ نود، ازخود نود کمتر است. کليد تمام نودهاي زير درخت سمت راست نود، ازخود نود بيشتر است.

Download Presentation

درخت جستجوی دودویی

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


5641532

درخت جستجوی دودویی

  • درخت جستجوي دودويي:

    • درخت دودويي

    • صفر نود يا بيشتر

    • اگر >0 نود:

      • هر نود داراي يک کليد يکتا است.

      • کليد تمام نودهاي زير درخت سمت چپ نود، ازخود نود کمتر است.

      • کليد تمام نودهاي زير درخت سمت راست نود، ازخود نود بيشتر است.

      • زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند.


5641532

درخت جستجوی دودویی

60

30

70

5

40

2

80

65

  • کليدهاي يکتا

  • نودهاي سمت چپ کمتر از ريشه

  • نودهاي سمت راست بيشتر از ريشه

  • زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند.

  • کليدهاي يکتا

  • نودهاي سمت چپ کمتر از ريشه

  • نودهاي سمت راست بيشتر از ريشه

  • زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند.


5641532

درخت جستجوی دودویی

20

15

25

12

22

درخت جستجوي دودويي نيست.

فرزند سمت راست 25 ازخودش کمتر است.

18

  • کليدهاي يکتا

  • نودهاي سمت چپ کمتر از ريشه

  • نودهاي سمت راست بيشتر از ريشه

  • زير درختهاي سمت چپ و راست درخت جستجوي دودويي نيستند.


5641532

درخت جستجوی دودویی

  • دقت کنيد که شرط کامل بودن در تعريف درخت جستجوي دودويي حضور ندارد.

    • لذا، پياده سازي لينک پيوندي بهتر است.

  • تعريف بازگشتي درخت جستجوي دودويي = الگوريتمهاي بازگشتي


5641532

درخت جستجوی دودویی:جستجو

  • جستجو:

    • از خواص درخت جستجوي دودويي استفاده کنيد.

    • از ريشه شروع کن

    • اگر ريشه برابر صفر بود، پيغام بده که درخت خالي است.

    • در غير اين صورت:

      • x را با ريشه مقايسه کن.

      • اگر x با کليد ريشه برابر بود، نود را برگردان.

      • اگر x از کليد ريشه کمتر بود، زير درخت سمت چپ را بگرد.

      • در غير اين صورت زير درخت سمت راست را بگرد.


5641532

درخت جستجوی دودویی: مثالی از جستجو

15 را پيدا کن.

ريشه خالي است؟ نه

15 را با مقدار ريشه (30( مقايسه کن

15 < 30 لذا زير درخت سمت چپ را بگرد.

15 را با 5 مقايسه کن

15 > 5لذا زير درخت سمت راست را بگرد.

15 را با 15 مقايسه کن

15 == 15 نود جاري را بر گردان

30

5

40

2

15


5641532

آنالیز درخت جستجوی دودویی

  • در ريشه يک مقايسه انجام مي دهيم

    • > Root يا < Root

  • با توجه به نتيجه:

    • به يکي از فرزندان مي رويم

    • يک مقايسه انجام مي دهيم.

  • حداکثر به اندازه ارتفاع درخت اين کار را انجام مي دهيم:

  • لذا، پيچيدگي زماني جستجو، وابسته به شکل درخت است.

    • خطی: O(n)

    • متوازن: O (log 2 n)


5641532

درج در درخت جستجوی دودویی

  • قوانين - الحاق بايد شرايط زير را برآورده کند:

    • کليد يکتا

    • فرزند سمت راست < پدر

    • فرزند سمت چپ > پدر

    • نودهاي مياني نيز بايد شرايط فوق را برآورده کنند.

  • يکتا بودن را چگونه چک کنيم؟

    • به همه نودها نگاه کنيم؟


5641532

درج در درخت جستجوی دودویی

  • نيازي نيست که به تمام نودها نگاه کنيم

    • از اين حقيقت استفاده مي کنيم که قبل از الحاق نود جديد، درخت از نوع جستجوي دودويي است.

    • لذا کافيست دنبال نود جديد در درخت بگرديم.

Add

30

15

5

40

Search for 15

15 ? 30, 15 < 30 => Left

15 ? 5, 15 > 5 => Right

15 ? 15, 15 == 15 => Not Unique

2

15


5641532

درج در درخت جستجوی دودویی

  • جستجوي نود جديدنه تنها مساله يکتا بودن را حل مي کند، بلکه ما را به جاي درست نود جديد رهنمون مي سازد.

30

Add

15

5

40

2

Search for 15

15 ? 30, 15 < 30 => Left

15 ? 5, 15 > 5 => Right

No right child, so not present

15

Add 15 as right child of 5


5641532

آنالیز عمل درج

  • عمده کار تابع الحاق، پياده سازي عمل جستجو است.

    • وابسته به شکل درخت است.

  • خود عمل الحاق داراي هزينه ثابت است.

  • لذا، هزينه کل وابسته به پيچيدگي عمل جستجو است.

    • در بدترين حالت: O(n)

    • در حالت ميانگين: O(log2n)


5641532

ارتفاع درخت جستجوی دودویی

  • در بدترين حالت ارتفاع درخت باينري برابر n است.

    • درخت خطی

40

مسائل درخت جستجوي دودويي از لحاظ پيچيدگي وابسته به ارتفاع درخت هستند که در بدترين حالت O(n) هست.

اگر داده ها مرتب يا نیمه مرتب باشند، درخت خطی خواهد گرديد.

30

5

2


5641532

ارتفاع درخت جستجوی دودویی

Insert: 3, 4, 6, 5, 8

root

3

4

6

8

5


Binary search trees height

Binary Search Trees: Height

  • اگر الحاقها به صورت تصادفي انجام گردند، ارتفاع درخت برابر O(log n) خواهد بود.

  • در حالت عمومي الحاقها تصادفي هستند، لذا اغلب ارتفاع برابر O(log n) خواهد شد.

  • راههاي وجود دارد که ارتفاعO(log n) را گارانتي نمود. بايد توابع الحاق و حذف را دستکاري نمود تا درخت متعادل شود.


Treesort

TreeSort:

  • نودهاي درخت جستجوي دودويي داراي نظم خاصي هستند.

  • تمام نودهاي سمت چپ از ريشه کوچکتر و تمام نودهاي سمت راست از آن بزرگتر هستند.

  • اين مطلب براي تمام نودها صادق است.

  • لذا، مي توان از پيمايش LVR براي توليد يک ليست مرتب استفاده کرد.

30

5

40

2

50

15

35

LVR Ordering: 2,5,15,30,35,40,50


Treesort1

TreeSort:

  • آناليز TreeSort:

    • بايد يک درخت جستجوي دودويي با سايز n بسازيم.

      • به n الحاق نياز داريم.

        • بهترين حالت: درخت متعادل O(n * log 2 n)

        • بدترين حالت: درخت خطی O(n2)

    • سپس LVR را اجرا مي کنيم.

      • هميشهO(n) است.

    • پس پيچيدگي TreeSort برابر است با:

      • بهترين حالت: O(n * log 2 n)

      • بدترين حالت: O(n2)


Binary search trees deletion

Binary Search Trees: Deletion

  • قوانين - حذف بايد شرايط زير را برآورده کند:

    • کليد يکتا

      • نيازي به چک کردن ندارد. چون قبل از عمل حذف کليدها يکتا هستند.

    • اما موارد زير بايد رعايت شوند:

      • فرزند سمت راست < پدر

      • فرزند سمت چپ > پدر

      • نودهاي مياني نيز بايد شرايط فوق را برآورده کنند.


Binary search trees deletion1

Binary Search Trees: Deletion

30

5

40

سه حالت:

1- حذف نود انتهايي (15) :

نود انتهايي را حذف کن.

اشاره گر پدر را برابر صفر قرار بده.

2

15

30

5

40

2


Binary search trees deletion2

Binary Search Trees: Deletion

30

2- نود غير انتهايي، داراي يک فرزند(5):

لينک نود پدر را که به نود حذف شونده اشاره دارد را به فرزند نود حذف شونده اشاره دهيد.

5

40

2

30

5

40

2


Binary search trees deletion3

Binary Search Trees: Deletion

3- نود غير انتهايي داراي دو فرزند:

مقدار نود حذف شونده را با بزرگترين المان سمت چپ يا کوچکترين المان سمت راست جابجا کنید.

نودي را که جابجا کرده ايد را حذف کنيد.

اين حذف کردن معادل يکي از حالتهاي 1 يا 2 خواهد بود.

30

5

40

toDelete

2

5

5

40

5

40

2

2


Binary search trees deletion4

Binary Search Trees: Deletion

  • قانون اصلي حذف:

    “با بزرگترين المان سمت چپ يا کوچکترين المان سمت راست جابجا کنيد”

  • آيا اين روش هميشه درست است؟

    • بله – چون بزرگترين المان سمت چپ

      • از تمام عناصر سمت چپ بزرگتر است.

      • از تمام عناصر سمت راست کوچکتراست.

    • کوچکترين المان سمت راست

      • از تمام عناصر سمت چپ بزرگتر است.

      • از تمام عناصر سمت راست کوچکتراست.

    • اينها، همان شرايطي هستند که ريشه زير درخت جستجوي دودويي نياز دارد.


5641532

حالت سوم حذف

  • اگر نود دو فرزند داشته باشد: (مثل نود ۱۰)

3

1

10

5

14

4

7

16

15

20


5641532

ادامه ی حالت سوم حذف

  • بعد از حذف ۱۰ دو زیر درخت خواهیم داشت:

  • نمی توانیم یکی از این زیر درخت ها را بالا بیاوریم.

    • اما می دانیم که تمام نودهای زیر درخت سمت چپ از خود نود کوچکتر هستند.

    • و تمام نودهای زیر درخت سمت راست از خود نود بزرگتر هستند.

3

1

10

5

14

4

7

16

15

20


5641532

ادامه ی حالت سوم حذف

  • چگونه دو زیر درخت را با هم یکی کنیم؟

  • بزرگترین عنصر سمت راست را پیدا کنید.

  • زیر درخت سمت راست را به آن نود وصل کنید.

3

3

3

1

10

1

10

1

5

5

7

4

5

14

14

7

4

4

7

16

14

16

15

20

16

15

20

15

20


5641532

مراحل حذف:

  • قدم اول:

  • نودی که باید حذف شود را پیدا کنید.

prev

3

node

1

10

5

14

4

7

16

15

20


5641532

مراحل حذف

  • قدم دوم:

  • بزرگترین عنصر زیردرخت سمت چپ را پیداکنید.

prev

3

node

prev

1

10

3

node

5

1

10

4

7

5

14

tmp

14

4

7

16

16

tmp

15

20

15

20


5641532

مراحل حذف

  • قدم سوم:

  • زیر درخت سمت راست نود را به این نود وصل کنید.

prev

prev

3

node

3

node

1

5

1

10

4

7

14

5

16

4

7

14

15

20

16

15

20


5641532

مراحل حذف

  • قدم چهارم:

  • اگر ریشه را قرار هست حذف کنید. باید ریشه را به طور مناسب تنظیم کنید و یکی از فرزندان نود که جابجا نمی شود تبدیل به ریشه ی جدید می گردد.

prev

3

node

1

5

4

7

14

16

15

20


5641532

کد حذف

public void remove(int id) {

BSTNode tmp, node, p=root, prev = null;

// find the node p which needs to be removed

while( p!=null && p.id!=id ) {

prev = p;

if( p.id<id )

p = p.right;

else

p = p.left;

}

node = p;

prev

3

node

1

10

p

5

14

4

7

16

15

20


5641532

ادامه ی کد حذف

if( p!=null && p.id==id ) {

// case (1)/(2): node has no right child:

// its left child ( if any ) is attached to its parent

if( node.right==null )

node = node.left;

// case (1)/(2): node has no left child:

// its right child ( if any ) is attached to its parent

else if( node.left==null )

node = node.right;


5641532

ادامه ی کد حذف

else {

// find the maximum node in the left subtree,

// store the node to tmp

tmp = node.left;

while( tmp.right!=null )

tmp = tmp.right;

// merge the right subtree to tmp's right child

tmp.right = node.right;

// lift node.left up

node = node.left;

}


5641532

ادامه ی کد حذف

if( p==root )

root = node;

else if( prev.left == p )

prev.left = node;

else

prev.right = node;

}

else if( root!=null )

System.out.println( "ID " + id + " is not in the database");

else

System.out.println( "The database is empty" );


  • Login