درخت ۲–۳

(تغییرمسیر از درخت ۲-۳)

در علم رایانه، ساختمان داده درخت ۲-۳، یک نوع درخت جستجوی خودمتوازن است. درخت‌های جستجوی دودویی ممکن است با درج‌ها و حذف‌های گوناگون، حالت توازن خود را از دست بدهند. حالتی را در نظر بگیرید که یک درخت دودویی جستجو دارید و n داده را که اتفاقاً از کوچک به بزرگ مرتب هستند به ترتیب در آن درج می‌کنید. در این حالت، این درخت عملاً به یک لیست پیوندی تبدیل می‌شود که جستجو در آن از مرتبه است و گذشته از این که مزیت استفاده از د.د.ج (درخت دودویی جستجو) از بین رفته، مقدار زیادی حافظه هم با اختصاص دادن به اشاره‌گرهای تهی از دست می‌رود. پیاده‌سازی توابع درج و حذف درخت ۲-۳ به گونه‌ای است که این درخت طی درج‌ها و حذف‌ها به صورت متوازن باقی می‌ماند.

ویژگی‌ها ویرایش

درخت ۲-۳ سه نوع گره دارد:

  1. گره برگ که فقط یک مقدار دارد.
  2. گرهِ ۲
  3. گرهِ ۳
 
گره ۲

در گره ۲،   مقدار گره،   زیردرخت سمت چپ و   زیردرخت راست گره است. هر گره ۲ باید خصوصیات زیر را داشته باشد:

  • هر مقدار در   باید کوچک‌تر از   باشد.
  • هر مقدار در   باید بزرگ‌تر از   باشد.
  • طول مسیرها از ریشه به برگ‌های هریک از زیردرخت‌ها باید یکسان باشد.
 
گره ۳

در گره ۳،   مقدار گره،   زیردرخت سمت چپ،   زیردرخت میانی و   زیردرخت راست گره است. هر گره ۳ باید خصوصیات زیر را داشته باشد:

  • هر مقدار در   باید کوچک‌تر از   باشد.
  • هر مقدار در   باید بزرگ‌تر از   و کوچک‌تر از  باشد.
  • هر مقدار در   باید بزرگ‌تر از   باشد.
  • طول مسیرها از ریشه به برگ‌های هریک از زیردرخت‌ها باید یکسان باشد.

باید توجه داشت که همه مقادیر در گره‌های برگ وجود دارند و گره‌های داخلی فقط برای هدایت جستجو ایجاد شده‌اند. هر گره داخلی یک گره ۳(با دو یا سه فرزند) است که مقدار   آن برابر با کوچک‌ترین مقدار موجود در زیردرخت دوم و مقدار   آن (در صورت وجود) برابر با کوچک‌ترین مقدار موجود در زیردرخت سوم است.

جستجو ویرایش

همان‌طور که گفته‌شد اطلاعات ذخیره‌شده در گره‌های داخلی باعث آسان‌شدن جستجو می‌شود. فرض کنید می‌خواهیم عنصر   را جستجو کنیم. از ریشه شروع می‌کنیم و به ترتیب زیر به سمت برگ‌ها می‌رویم:

  • اگر   کوچک‌تر از مقدار  ریشه بود بهزیردرخت چپ می‌رویم.
  • (درصورتی که دو زیر درخت داشته باشیم) اگر   بزرگ‌تر از مقدار   ریشه بود به زیردرخت راست می‌رویم.
  • اگر   بزرگ‌تر از مقدار   ریشه و کوچک‌تر از   آن بود به زیردرخت میانه می‌رویم.
  • اگر   بزرگ‌تر از مقدار   ریشه بود به زیردرخت راست می‌رویم.

این کار را برای گره‌های داخلی مسیر انجام می‌دهیم تا به برگ   برسیم. اگر  ، جستجو موفق و در غیر این صورت ناموفق است.

درج در درخت ۲-۳ ویرایش

می‌خواهیم   را در درخت ۲-۳ درج کنیم. ابتدا باید   را جستجو کنیم. اگر این جستجو ناموفق باشد به عنصری مثل   می‌رسیم که انتظار داشتیم پدر   باشد. حال دو حالت پیش می‌آید:

  •   دو فرزند دارد که در این حالت   را به عنوان فرزند سوم   در جای مناسب آن درج می‌کنیم و تغییرات لازم را در گره‌های داخلی اعمال می‌کنیم.
  •   سه فرزند دارد و درج چهار فرزند برای   مجاز نیست. یک برادر سمت چپ مثل   برای   ایجاد می‌کنیم دو فرزند کوچک‌تر را فرزند آن قرار می‌دهیم.   را هم به صورت بازگشتی در سطح بالاتر درخت درج می‌کنیم.

به عنوان یک مثال می‌خواهیم عنصر x=۵ را در درخت زیر درج کنیم.

 
درج در درخت ۲-۳

درخت حاصل به شکل زیر خواهد بود:

 
درج در درخت ۲-۳

حذف از درخت ۲-۳ ویرایش

برای حذف هم ابتدا باید عنصر مورد نظر مثل   را جستجو، پیدا و آن را حذف کنیم. اگر   پدر   باشد دو حالت وجود دارد:

  • دو فرزند برای   باقی‌مانده‌است. که در این صورت حذف پایان یافته و نیاز به عمل دیگری نیست.
  • تنها یک فرزند دیگر برای   باقی‌مانده‌است که آن را   می‌نامیم. در این حالت، اگر   ریشه باشد آن را حذف و   را ریشه قرار می‌دهیم. در غیر این صورت باید از عموهای   کمک بگیریم. بدین ترتیب که اگر یکی از آن‌ها سه فرزند داشته باشند فرزند مناسب آن را به   می‌دهیم تا هر دو دو فرزند داشته باشند. ولی اگر هر دو عموی   دو فرزند داشته باشند این بار   را به یکی از آن‌ها می‌دهیم و به طور بازگشتی   را از درخت حذف می‌کنیم.

نگارخانه ویرایش

منابع ویرایش