User talk:Zs.hoseini

درخت جستجوی دو دویی
ساختار یک درخت جستجوی [دودویی]به این شکل است که هر رأس آن بین 0 تا 2 [فرزند] دارد و فرزندان هر [ریشه] به گونه ای هستند که فرزند چپ همیشه از خود ریشه کوچکتر و فرزند راست از ریشه بزرگتر است.

مثال:
اعداد زیر را به ترتیب در رخت جستجوی دودویی [درج] کنید. 12-25-6-2-8-22-9-1-13

شکل درخت پس از درج عناصر در آن به ترتیب اضافه کردن عناصر به آن بستگی دارد. در حالتی که هر بار [مینیمم] و یا [ماکسیمم] عناصر باقی مانده را برای درج انتخاب کنیم ، [ارتفاع درخت] بیشینه و برابر n (تعداد عناصر) خواهد شد. و در حالتی که هر بار [میانه] ی عناصر را انتخاب کنیم، ارتفاع درخت کمینه خواهد شد. ارتفاع درخت در این حالت lg n خواهد بود. در واقع درخت به صورت دودویی کامل ساخته خواهد شد.

پیدا کردن مینیمم و ماکسیمم
برای پیدا کردن مینیمم باید تا جایی که می توانیم به چپ برویم تا به آخرین عنصر برسیم(عنصری که فرزند چپ ندارد) این عنصر هماتن مینیمم است، پیدا کردن ماکسیمم هم به همین صورت است با این تفاوت که درخت را به راست [پیمایش] می کنیم،تا جایی که [گره] دیگر فرزند راست نداشته باشد. TREE-MIN(x) { While(x.left!=nil) X=x.left; Return x; }

TREE-MAX(x) { While(x.right!=nil) X=x.right; Return x; }

جستجو
ابتدا عنصر مورد نظر را با ریشه مقایسه می کنیم ، اگر برابر بودند که پیدا شده ، در غیر این صورت اگر کوچکتر بود به زیر [درخت چپ] رفته و اگر بزرگتر بود به زیر درخت راست میرویم، و عمل مقایسه را تکرار می کنیم تا عنصر مورد نظر پیدا شود. اگر به جایی رسیدیم که گره ای که عمل مقایسه را با آن انجام داده ایم فرزندی نداشت ، یعنی عنصر مورد نظر در درخت وجود نداشته است. TREE-SEARCH(x,k) { If( x=nil) Return " NOT FOUND"; If (k=key[x]) Return x; If (kz) X=x.left; Else X=x.right; }  Y=p[x]; If (y==nil) Root=z; else If(z<y.key) y.left=z; else y.right=z; p[z]=y; }

حذف
فرض میکنیم z عنصری است که می خواهیم آن را حذف کنیم، 3 حالت به وجود می آید: 1.	Z فرزندی ندارد: به راحتی آن را حذف می کنیم. 2.	Z یک فرزند دارد: z را حذف کرده و با حفظ فرزند چپ یا راست بودن z فرزندش را به جای خودش قرار می دهیم، مثلا اگر z فرزند راست پدرش بود، فرزند z را هم بچه ی راست پدر بزرگش قرار می دهیم. 3.	Z یک زیر درخت دارد که شامل بیش از یک عنصر است.در این حالت باید پس از حذف z عنصری را به جای آن قرار دهیم که مثل z عمل کند ، یعنی تمام عناصر سمت راست از آن بزرگتر و تمام عناصر سمت چپ از آن کوچکتر باشند.این عنصر اولین عنصر بزرگتر از z می باشد که در درخت موجود است و عنصر جانشین (successor ) نام دارد. عنصر جانشین کوچکترین عنصر در زیر درخت راست z می باشد و فرزند چپ ندارد(چون کوچکترین عنصر است !)

TREE-SUCCESSOR(x) {   If(x.right!=nil) Return TREE-MIN(x.right); Y=p[x]; While ( y!=nil && x==y.right) {   X=y; Y=p[x]; } }

نکته:
اگر روی درخت جستجوی دودویی پیمایش inorder ( اول چپ ،بعد ریشه ،بعد راست) را انجام دهیم ، یک رشته ی مرتب شده به دست می آید. اگر پیمایش این چنینی درختی مرتب نبود می توان نتیجه گرفت که آن درخت جستجوی دودویی نیست.