موضوع مقاله: درخت جستجوی دودویی | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # درخت جستجوی دودویی | مقدمه: در علوم رایانه، درخت جستجوی دودویی که گاهی درخت دودویی مرتب هم نامیده می‌شود، یک ساختار داده است و نوعی درخت دودویی است. | ## بخش 1: درخت جستجوی دودویی | یک درخت باینری نوعی ساختار داده برای ذخیره کردن داده‌است مانند عددهاییی که مرتب شده هستند. درخت جست و جوی دودویی این امکان را فراهم می‌کند که جست و جوی یک عدد، اضافه کردن آن و حذف کردن آن با سرعت بیشتری انجام شود. همچنین این امکان را فراهم می‌کند که مجموعه‌های پویا و جداول جست و جو را پیاده‌سازی کنیم. ترتیب گره‌ها در درخت جست و جوی دودویی به صورتی است که در هر مقایسه نیمی از درخت باقی مانده بررسی نمی‌شود؛ بنابراین زمان جست و جوی درخت متناسب با لگاریتم تعداد عددهای ذخیره شده در درخت است. این زمان بسیار کمتر از زمان جست و جوی خطی در یک آرایه مرتب نشده‌است اما کندتر از انجام عملیات درهم سازی است. تعریف درخت جستجوی دودویی، نوعی درخت دودویی است که ممکن است تهی باشد، اگر تهی نباشد، دارای خصوصیات زیر است: از تعدادی گره تشکیل شده که هر گره دارای یک کلید است. تمام کلیدهایی که در زیردرخت سمت راست واقع شده‌اند، بزرگتر از کلید گره ریشه هستند. این ویژگی تضمین می‌کند که پیمایش میان‌ترتیب یک درخت جستجوی دودویی، کلیدها را به ترتیب صعودی نمایش می‌دهد. در ادامه برخی اصطلاح‌های مهم مربوط به درخت مورد اشاره قرار گرفته‌است: مسیر (path) – منظور از مسیر در یک درخت، یک توالی از گره‌ها در راستای یال‌های درخت است. والد (parent) – هر گرهی به جز گره ریشه یالی به سمت بالا به یک گره دارد، که والد آن گره نامیده می‌شود. فرزند (child) – گرهی که زیر یک گره مفروض قرار دارد و از طریق یالی به سمت پایین به آن وصل شده‌است، گره فرزند آن نامیده می‌شود. اگر گره ریشه در سطح ۰ باشد، در این صورت فرزندان آن در سطح ۱، نوه‌های آن در سطح ۲ و همین‌طور تا آخر … قرار دارند. کلیدها (Keys) – کلید نماینده ارزش یک گره بر مبنای نوع عملیات جستجویی است که قرار است روی گره انجام شود. عملیات اصلی بر روی یک درخت جستجوی دودویی به زمانی متناسب با ارتفاع درخت احتیاج دارد. برای یک درخت دودویی کامل با n گره چنین عملیاتی در بدترین حالت در زمان (o(logn اجرا می‌شود؛ بنابراین اگر درخت یک زنجیر خطی با n گره باشد همین عملیات در زمان بدترین حالت (o(n اجرا می‌شود. امید ریاضی ارتفاع یک درخت جستجوی دودویی که به تصادف ساخته شده‌است برابر با (o(logn است؛ بنابراین عملیات اصلی مجموعه پویا بر روی چنین درختی در حالت میانگین به زمان (o(logn احتیاج دارد. در عمل، همیشه نمی‌توانیم تضمین کنیم که درخت‌های جستجوی دودویی به تصادف ساخته می‌شوند. | ## بخش 2: درخت جستجوی دودویی | اما می‌توانیم انواع مختلفی از درخت‌های جستجوی دودویی را با کارایی بدترین حالتی که بر روی عملیات اصلی به خوبی تضمین شده باشد طراحی کرد. بعد از ارائه ویژگی‌های اصلی درخت‌های جستجوی دودویی در بخش‌های بعد نشان می‌دهیم چگونه برای چاپ مقادیر یک درخت جستجوی دودویی به صورت مرتب، عملیات روی آن را انجام می‌دهیم. عملیات اصلی بر روی درخت جستجوی دودویی معمولاً عملیات زیر بر روی یک درخت جستجوی دودویی تعریف می‌شود: ایجاد یک درخت جستجوی خالی آزمایش خالی بودن درخت درج کردن یک کلید جدید در درخت، بدون برهم خوردن خاصیت درخت جستجو کردن و یافتن یک کلید خاص در درخت حذف کردن یک کلید از درخت، با حفظ خاصیت درخت پیمایش درخت جستجوی دودویی، به‌طوری تمام گره‌ها دقیقاً یک بار مورد دسترسی قرار گیرند. جستجو انواع جست و جو و پیمایش در درخت جست و جوی دودویی جستجو (Search) – به دنبال یک عنصر در درخت می‌گردد. اگر یک درخت باینری به صوت میان‌ترتیبی پیموده شود، مقادیر کلیدهای ذخیره شده در خروجی به ترتیب نزولی نمایش داده می‌شود الگوریتم تا زمانی که همه گره‌ها بازدید شوند: گام ۱- زیردرخت چپ را به صورت بازگشتی پیمایش کن گام ۲ – گره ریشه را بازدید کن گام ۳ – زیردرخت سمت راست را به صورت بازگشتی پیمایش کن. الگوریتم تا زمانی که همه گره‌ها پیمایش شوند: گام ۱ – زیردرخت چپ را به صورت بازگشتی پیمایش کن. برای پیدا کردن گرهی با یک کلید خاص مانند key در درخت، ابتدا باید از ریشه درخت شروع کنیم. در غیر این صورت، key را با مقدار گره ریشه مقایسه می‌کنیم، اگر برابر بودند، جستجو موفق است و گره ریشه همان گره مورد نظر است. در این حالت، هیچ عنصری در زیردرخت سمت راست وجود ندارد که مقدار کلید آن برابر با key باشد؛ بنابراین جستجو باید در زیردرخت سمت چپ ادامه یابد. در این حالت، هیچ عنصری در زیردرخت سمت چپ وجود ندارد که مقدار کلید آن برابر با key باشد؛ بنابراین جستجو باید در زیردرخت سمت راست ادامه یابد. سپس بسته به حالت یک و دو، زیردرخت سمت چپ یا زیردرخت سمت راست را به روش بازگشتی و با استفاده از الگوریتم بالا جستجو می‌کنیم. برای حفظ خاصیت اول (منحصربه‌فرد بودن کلیدها)، باید ابتدا درخت را جستجو کنیم تا مطمئن شویم که عنصر قبلاً در درخت درج نشده‌است. پس از اینکه مطمئن شدیم کلید مورد نظر از قبل در درخت وجود ندارد، می‌توانیم کلید را در درخت درج کنیم. اگر درخت تهی بود، کافیست گره جدید را به عنوان گره ریشه درج کنیم تا عمل درج خاتمه یابد. اگر درخت خالی نبود، کلید جدید را با ریشه مقایسه می‌کنیم، که دو حالت جستجو پیش می‌آید: کلید جدید از ریشه کوچکتر است. به‌طوری که P(i) نشان‌دهنده والد گره i و C(i) نشان‌دهنده فرزند گره i است (چپ یا راست). در مورد حذف یک گره از درخت دودویی، سه حالت مختلف پیش می‌آید: i یک گره برگ است.گره برگ به گرهی می‌گویند که درجه آن صفر باشد. | ## بخش 3: درخت جستجوی دودویی | در حالت اول، کافیست اشاره‌گر مناسبی (چپ یا راست) از P(i) را برابر تهی قرار دهیم، عمل حذف خاتمه می‌یابد. در حالت دوم که i یک فرزند دارد، ابتدا گره i را حذف می‌کنیم، سپس فرزند i یا همان C(i) را جانشین گره i می‌کنیم. سپس ما این فرایند را با حذف کردن این عنصر جایگزین از زیر‌درختی که از آن گرفته شده‌است، دنبال می‌کنیم. به عبارتی دیگر، اگر بخواهیم گره N را از درخت حذف کنیم (که این گره دو فرزند دارد)، به جای اینکه خود گره N را پاک کنیم، یا گره بعد از N در پیمایش میانوندی یا گره قبلی N در پیمایش میانوندی را انتخاب می‌کنیم و آن گره را R می‌نامیم. تابع transplant این تابع در تابع حذف گره از درخت استفاده می‌شود، این تابع دوگره u و v را به عنوان ورودی می‌گیرد و اگر u ریشه درخت باشد آنگاه v را ریشه درخت قرار می‌دهد، اگر u ریشه دره نباشد پدر u را به v اشاره می‌دهد، و اگر v نال نبود پدر v را پدر u قرار می‌دهد، در واقع این تابع v را جای u قرار می‌دهد و از نظر رابطه با گرهٔ پدر کارها را درست می‌کند ولی کاری به جابه‌جا کردن فرزندان u , v ندارد. پیمایش درخت پیمایش درخت بدین معنی است که به همه عناصر به ترتیب خاصی دسترسی داشته باشیم، بدون اینکه گرهی جا بیفتد یا اینکه گرهی دو بار در دسترس قرار گیرد. درخت جستجوی دودویی یک درخت دودویی است که می‌توان آن را به روش‌های معمول پیمایش کرد. اما از آنجا که نحوه قرار گرفتن عناصر در یک درخت جستجوی دودویی، تضمین می‌کند در هنگام پیمایش درخت به صورت میانوندی، عناصر به ترتیب صعودی در دسترس قرار گیرند، ما این نوع پیمایش را در ادامه بررسی می‌کنیم. درخت جستجوی دودویی به روش پیش‌ترتیب و پس‌ترتیب هم می‌توان پیمایش کرد، اما این نوع پیمایش‌ها در یک درخت جستجوی دودویی بیهوده هستند. پیمایش میانوندی بدین شکل تعریف می‌شود: اگر زیردرخت سمت چپ وجود دارد، آن را به روش میانوندی پیمایش کنید. درخت اسپلی نوعی درخت دودویی است که عناصری که مکرراً مورد استفاده قرار می‌گیرند را به صورت خودکار به ریشه درخت نزدیک می‌کند تا دسترسی به آن‌ها راحت‌تر شود. در یک تریپ، (tree heap) هر گره یک اولویت دارد که این اولویت به شکل تصادفی به گره اختصاص می‌یابد و گره والد اولویت بیشتری نسبت به فرزندش دارد. درختان تانگو نوعی درخت جستجوی دودویی هستند که برای جستجوهای بسیار سریع مورد استفاده قرار می‌گیرند. اگر با درج عنصر جدید در درخت تابع افزودن گره، ارتفاع درخت را متوازن نکند، می‌توان به سادگی از بک درخت تباهیده کنک گرفت به‌طوری که آن را با داده‌های از قبل مرتب شده پر کرد. در این مقایسه تریپ را به عنوان بهترین عملکرد در حالت میانگین معرفی کرد در حالی که در همین مقایسه درخت سرخ-سیاه کمترین اختلاف را بین بدترین حالت و بهترین حالتش دارد هرچند به‌طور میانگین تریپ بهتر ازآن عمل می‌کند. | ## جمع‌بندی | درخت جست و جوی دودویی بهینه برای این که bstهایی که داریم را به نحوی تغییر دهیم که الگوریتم جست وجوی بهینه ای داشته باشیم از روش زیر مب توان استفاده کرد: گره‌هایی که بیشترین استفاده را دارند و دسترسی به آن‌ها مورد نیاز است را نزدیک ریشه قرار می‌دهیم.