Download presentation
Presentation is loading. Please wait.
Published byΚαλλιστράτης Σπανού Modified over 6 years ago
1
درخت جستجوی دودویی درخت جستجوي دودويي: درخت دودويي صفر نود يا بيشتر
اگر >0 نود: هر نود داراي يک کليد يکتا است. کليد تمام نودهاي زير درخت سمت چپ نود، ازخود نود کمتر است. کليد تمام نودهاي زير درخت سمت راست نود، ازخود نود بيشتر است. زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند.
2
درخت جستجوی دودویی 60 30 70 5 40 2 80 65 کليدهاي يکتا
نودهاي سمت چپ کمتر از ريشه نودهاي سمت راست بيشتر از ريشه زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند. کليدهاي يکتا نودهاي سمت چپ کمتر از ريشه نودهاي سمت راست بيشتر از ريشه زير درختهاي سمت چپ و راست نيز درخت جستجوي دودويي هستند.
3
درخت جستجوی دودویی 20 15 25 12 22 درخت جستجوي دودويي نيست.
فرزند سمت راست 25 ازخودش کمتر است. 18 کليدهاي يکتا نودهاي سمت چپ کمتر از ريشه نودهاي سمت راست بيشتر از ريشه زير درختهاي سمت چپ و راست درخت جستجوي دودويي نيستند.
4
دقت کنيد که شرط کامل بودن در تعريف درخت جستجوي دودويي حضور ندارد.
درخت جستجوی دودویی دقت کنيد که شرط کامل بودن در تعريف درخت جستجوي دودويي حضور ندارد. لذا، پياده سازي لينک پيوندي بهتر است. تعريف بازگشتي درخت جستجوي دودويي = الگوريتمهاي بازگشتي
5
درخت جستجوی دودویی:جستجو
جستجو: از خواص درخت جستجوي دودويي استفاده کنيد. از ريشه شروع کن اگر ريشه برابر صفر بود، پيغام بده که درخت خالي است. در غير اين صورت: x را با ريشه مقايسه کن. اگر x با کليد ريشه برابر بود، نود را برگردان. اگر x از کليد ريشه کمتر بود، زير درخت سمت چپ را بگرد. در غير اين صورت زير درخت سمت راست را بگرد.
6
درخت جستجوی دودویی: مثالی از جستجو
15 را پيدا کن. ريشه خالي است؟ نه 15 را با مقدار ريشه (30( مقايسه کن 15 < 30 لذا زير درخت سمت چپ را بگرد. 15 را با 5 مقايسه کن 15 > 5 لذا زير درخت سمت راست را بگرد. 15 را با 15 مقايسه کن 15 == 15 نود جاري را بر گردان 30 5 40 2 15
7
آنالیز درخت جستجوی دودویی
در ريشه يک مقايسه انجام مي دهيم > Root يا < Root با توجه به نتيجه: به يکي از فرزندان مي رويم يک مقايسه انجام مي دهيم. حداکثر به اندازه ارتفاع درخت اين کار را انجام مي دهيم: لذا، پيچيدگي زماني جستجو، وابسته به شکل درخت است. خطی: O(n) متوازن: O (log 2 n)
8
درج در درخت جستجوی دودویی
قوانين - الحاق بايد شرايط زير را برآورده کند: کليد يکتا فرزند سمت راست < پدر فرزند سمت چپ > پدر نودهاي مياني نيز بايد شرايط فوق را برآورده کنند. يکتا بودن را چگونه چک کنيم؟ به همه نودها نگاه کنيم؟
9
درج در درخت جستجوی دودویی
نيازي نيست که به تمام نودها نگاه کنيم از اين حقيقت استفاده مي کنيم که قبل از الحاق نود جديد، درخت از نوع جستجوي دودويي است. لذا کافيست دنبال نود جديد در درخت بگرديم. 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
10
درج در درخت جستجوی دودویی
جستجوي نود جديد نه تنها مساله يکتا بودن را حل مي کند، بلکه ما را به جاي درست نود جديد رهنمون مي سازد. 30 Add 15 5 40 Search for 15 15 ? 30, 15 < 30 => Left 15 ? 5, 15 > 5 => Right No right child, so not present 2 15 Add 15 as right child of 5
11
عمده کار تابع الحاق، پياده سازي عمل جستجو است.
آنالیز عمل درج عمده کار تابع الحاق، پياده سازي عمل جستجو است. وابسته به شکل درخت است. خود عمل الحاق داراي هزينه ثابت است. لذا، هزينه کل وابسته به پيچيدگي عمل جستجو است. در بدترين حالت: O(n) در حالت ميانگين: O(log2n)
12
ارتفاع درخت جستجوی دودویی
ارتفاع درخت جستجوی دودویی در بدترين حالت ارتفاع درخت باينري برابر n است. درخت خطی 40 مسائل درخت جستجوي دودويي از لحاظ پيچيدگي وابسته به ارتفاع درخت هستند که در بدترين حالت O(n) هست. اگر داده ها مرتب يا نیمه مرتب باشند، درخت خطی خواهد گرديد. 30 5 2
13
ارتفاع درخت جستجوی دودویی
ارتفاع درخت جستجوی دودویی Insert: 3, 4, 6, 5, 8 root 3 4 6 8 5
14
Binary Search Trees: Height
اگر الحاقها به صورت تصادفي انجام گردند، ارتفاع درخت برابر O(log n) خواهد بود. در حالت عمومي الحاقها تصادفي هستند، لذا اغلب ارتفاع برابر O(log n) خواهد شد. راههاي وجود دارد که ارتفاعO(log n) را گارانتي نمود. بايد توابع الحاق و حذف را دستکاري نمود تا درخت متعادل شود.
15
نودهاي درخت جستجوي دودويي داراي نظم خاصي هستند.
TreeSort: نودهاي درخت جستجوي دودويي داراي نظم خاصي هستند. تمام نودهاي سمت چپ از ريشه کوچکتر و تمام نودهاي سمت راست از آن بزرگتر هستند. اين مطلب براي تمام نودها صادق است. لذا، مي توان از پيمايش LVR براي توليد يک ليست مرتب استفاده کرد. 30 5 40 2 50 15 35 LVR Ordering: 2,5,15,30,35,40,50
16
TreeSort: آناليز TreeSort: بهترين حالت: درخت متعادل O(n * log 2 n)
سپس LVR را اجرا مي کنيم. هميشهO(n) است. پس پيچيدگي TreeSort برابر است با: بهترين حالت: O(n * log 2 n) بدترين حالت: O(n2)
17
Binary Search Trees: Deletion
قوانين - حذف بايد شرايط زير را برآورده کند: کليد يکتا نيازي به چک کردن ندارد. چون قبل از عمل حذف کليدها يکتا هستند. اما موارد زير بايد رعايت شوند: فرزند سمت راست < پدر فرزند سمت چپ > پدر نودهاي مياني نيز بايد شرايط فوق را برآورده کنند.
18
Binary Search Trees: Deletion
30 5 40 سه حالت: 1- حذف نود انتهايي (15) : نود انتهايي را حذف کن. اشاره گر پدر را برابر صفر قرار بده. 2 15 30 5 40 2
19
Binary Search Trees: Deletion
30 2- نود غير انتهايي، داراي يک فرزند(5): لينک نود پدر را که به نود حذف شونده اشاره دارد را به فرزند نود حذف شونده اشاره دهيد. 5 40 2 30 5 40 2
20
Binary Search Trees: Deletion
3- نود غير انتهايي داراي دو فرزند: مقدار نود حذف شونده را با بزرگترين المان سمت چپ يا کوچکترين المان سمت راست جابجا کنید. نودي را که جابجا کرده ايد را حذف کنيد. اين حذف کردن معادل يکي از حالتهاي 1 يا 2 خواهد بود. 30 5 40 toDelete 2 5 5 40 5 40 2 2
21
Binary Search Trees: Deletion
قانون اصلي حذف: “با بزرگترين المان سمت چپ يا کوچکترين المان سمت راست جابجا کنيد” آيا اين روش هميشه درست است؟ بله – چون بزرگترين المان سمت چپ از تمام عناصر سمت چپ بزرگتر است. از تمام عناصر سمت راست کوچکتراست. کوچکترين المان سمت راست اينها، همان شرايطي هستند که ريشه زير درخت جستجوي دودويي نياز دارد.
23
اگر نود دو فرزند داشته باشد: (مثل نود ۱۰)
حالت سوم حذف اگر نود دو فرزند داشته باشد: (مثل نود ۱۰) 3 1 10 5 14 4 7 16 15 20
24
بعد از حذف ۱۰ دو زیر درخت خواهیم داشت:
ادامه ی حالت سوم حذف بعد از حذف ۱۰ دو زیر درخت خواهیم داشت: نمی توانیم یکی از این زیر درخت ها را بالا بیاوریم. اما می دانیم که تمام نودهای زیر درخت سمت چپ از خود نود کوچکتر هستند. و تمام نودهای زیر درخت سمت راست از خود نود بزرگتر هستند. 3 1 10 5 14 4 7 16 15 20
25
ادامه ی حالت سوم حذف چگونه دو زیر درخت را با هم یکی کنیم؟ بزرگترین عنصر سمت راست را پیدا کنید. زیر درخت سمت راست را به آن نود وصل کنید. 3 3 3 1 10 1 10 1 5 5 7 5 14 4 14 4 7 4 7 16 14 16 15 20 16 15 20 15 20
26
نودی که باید حذف شود را پیدا کنید.
مراحل حذف: قدم اول: نودی که باید حذف شود را پیدا کنید. prev 3 node 1 10 5 14 4 7 16 15 20
27
مراحل حذف prev 3 node prev 1 10 3 node 5 1 10 4 5 14 tmp 14 4 16 16
قدم دوم: بزرگترین عنصر زیردرخت سمت چپ را پیداکنید. 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
28
مراحل حذف prev prev 3 node 3 node 1 5 1 10 4 5 14 16 4 14 15 16 15
قدم سوم: زیر درخت سمت راست نود را به این نود وصل کنید. prev prev 3 node 3 node 1 5 1 10 4 7 5 14 16 4 7 14 15 20 16 15 20
29
مراحل حذف prev 3 node 1 5 4 14 16 15 قدم چهارم:
اگر ریشه را قرار هست حذف کنید. باید ریشه را به طور مناسب تنظیم کنید و یکی از فرزندان نود که جابجا نمی شود تبدیل به ریشه ی جدید می گردد. prev 3 node 1 5 4 7 14 16 15 20
30
کد حذف 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
31
ادامه ی کد حذف 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;
32
ادامه ی کد حذف 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; }
33
ادامه ی کد حذف 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"); System.out.println( "The database is empty" );
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.