پرش به محتوا

درخت گسترده: تفاوت میان نسخه‌ها

از ویکی‌پدیا، دانشنامهٔ آزاد
محتوای حذف‌شده محتوای افزوده‌شده
Ahmad87 (بحث | مشارکت‌ها)
بدون خلاصۀ ویرایش
 
(۳۷ نسخهٔ میانی ویرایش شده توسط ۲۳ کاربر نشان داده نشد)
خط ۱: خط ۱:
'''درخت گسترده''' {{انگلیسی|Splay tree}} یک [[درخت جستجوی دودویی]] خود متوازن است؛ که قابلیت اصلی آن تسهیل فرایند دسترسی به اطلاعاتی است که جدیداً به آن‌ها مراجعه کرده‌ایم. این درخت اعمال اصلی مانند درج و جستجو و حذف را در<math>O(lg n)</math>انجام می‌دهد. برای بسیاری از دنباله‌های غیر تصادفی، این درخت بهتر از سایر درخت‌های جستجو عمل می‌کند. درخت اسپلی توسط [[دانیل اسلیتور]] و [[رابرت تارجان]] در سال ۱۹۸۵ ابداع شد.
'''درخت اسپلی''' یک [[درخت جستجوی دودویی]] خود متعادل است. که از قابلیت‌های جدیدی برخوردار می‌باشد که دسترسی به اطلاعات جدیدا دسترسی یافته را سهولت می‌بخشد. و عناصری که اخیرا دسترسی یافته اند سریعتر مورد دسترسی قرار می گیرند.این درخت اعمال اساسی مانند درج و جستجو و حذف را در(o(lgnانجام می دهد.
برای خیلی از دنباله‌های غیر یکنواخت ، بهتر از سایر درخت‌های جستجو عمل می کند.درخت اسپلی به وسیله [[«دانیل اسلیتور» ]]و [[«رابرت تارجان»]] در سال 1985 اختراع شد.
همهٔ عملیات معمول در درخت جستجوی دودویی با یک عمل پایه به نام splaying ترکیب می شوند.به این معنی که برای یک عنصر خاص درخت را باز می آراید تا عنصر در ریشهٔ درخت قرار بگیرد.یک راه انجام این کار این است که ابتدا یک جستجو برای یافتن عنصر مورد نظر انجام می دهیم وسپس آن را به بالای درخت می رسانیم.
==مزایا:==
*کارایی بهتر : کارایی بهتر برای یک درخت اسپلی به خود متوازنی آن بستگی دارد و به این که عناصری که بارها دسترسی یافته اند به ریشه نزدیکتر شوند تا سریعتر مورد دسترسی قرار بگیرند. این تقریبا برای تمام کاربردهای عملی این ساختار مزیتی است که برای پیاده سازی[[ cache ]]و الگوریتم [[garbage collection]] بسیار مفید است.این ساختار هنگامی کارامدتر خواهد بود که دسترسی به صورت یک پارچه نباشد.
*پیاده سازی ساده تر: پیاده سازی ساده تری نسبت به دیگر درختهای جستجوی دودویی خود متوازن، مانند [[درخت قرمز سیاه]] و یا [[درخت هایAVL ]]دارد.
*امکان ایجاد یک نسخه پایدار: که اجازه دسترسی به هر دو نسخه قبلی و جدید را پس از بروز رسانی می دهد . این می تواند در برنامه نویسی تابعی مفید باشد و به(O(lgn فضا در هر بروز رسانی نیاز دارد.
*بر خلاف سایر انواع درختان خود متعادل به خوبی با گره حاوی کلیدهای هویت کار می کند. حتی با وجود کلیدهای هویت ، عملکرد در (O(lgn باقی می ماند. یک طراحی دقیق عملیات find می تواند چپ‌ترین و یا راست‌ترین گرهٔ کلید داده شده را برگرداند.
==معایب==


در این درخت همهٔ عملیات معمول در درخت [[جستجوی دودویی]] با عمل پایه '''گسترش''' ترکیب می‌شوند. به این معنی که برای یک عنصر خاص درخت را باز می‌آراید تا عنصر در ریشهٔ درخت قرار بگیرد. یک راه انجام این کار این است که ابتدا یک جستجو برای یافتن عنصر مورد نظر انجام دهیم و سپس آن را به بالای درخت برسانیم.
*درختانی می توانند وجود داشته باشند که توزیع داده شده از ورودی را "کمی" سریعتر انجام می دهند.
*عملکرد ضعیف در دسترسی یکنواخت : عملکرد درخت اسپلی بطور قابل توجهی بدتر از درخت جستجوی دودویی متعادل ساده برای دسترسی یکنواخت است.
*یکی از بدترین حالت‌های الگوریتم درخت اسپلی دسترسی ترتیبی به همه عناصر در درخت مرتب شده است که درخت را کاملا نامتعادل می‌کند (این n دسترسی دارد که هرکدام از (o(lgn است). دوباره مورد دسترسی قرار دادن عنصر اول ،باعث می‌شود که عملیاتی که از (O(n است اجرا شود تا درخت دوباره متوازن شود (قبل بازگشت عنصر اول).این تاخیر قابل توجهی برای عملیات نهایی است ، با این حال ، تحقیقات اخیر نشان می دهد که «متعادل‌سازی تصادفی» می تواند از اثر عدم تعادل جلوگیری کند و بازدهی مشابه سایر الگوریتم‌های خود متوازن بدهد .


== مزایا ==
* کارایی بهتر: کارایی بهتر برای یک درخت گسترده به خود متوازنی آن بستگی دارد و به این که عناصری که بارها دسترسی یافته‌اند به ریشه نزدیکتر شوند تا سریعتر مورد دسترسی قرار بگیرند. این تقریباً برای تمام کاربردهای عملی این ساختار مزیتی است که برای پیاده‌سازی [[کاشه|حافظه نهان]] و الگوریتم [[بازیافت حافظه]] بسیار مفید است. این ساختار هنگامی کارآمدتر خواهد بود که دسترسی به صورت یک‌پارچه نباشد.
* پیاده‌سازی ساده‌تر: پیاده‌سازی ساده‌تری نسبت به دیگر درخت‌های جستجوی دودویی خود متوازن، مانند [[درخت سرخ-سیاه|درخت قرمز سیاه]] یا [[درخت ای‌وی‌ال]] دارد.
* امکان ایجاد یک نسخه پایدار: که اجازه دسترسی به هر دو نسخه قبلی و جدید را پس از بروزرسانی می‌دهد. این می‌تواند در [[برنامه‌نویسی تابعی]] مفید باشد و به <math>O(lg n)</math> فضا در هر بروزرسانی نیاز دارد.
* بر خلاف سایر انواع درختان خود متوازن به خوبی با گره حاوی کلیدهای هویت کار می‌کند. حتی با وجود کلیدهای هویت، عملکرد در <math>O(lg n)</math> باقی می‌ماند. یک طراحی دقیق عملیات پیدا کردن می‌تواند چپ‌ترین یا راست‌ترین گرهٔ کلید داده شده را برگرداند.


== معایب ==
==فعالیت با Splay==
* درختانی می‌توانند وجود داشته باشند که توزیع دادهٔ ورودی را کمی سریع‌تر انجام می‌دهند.
* عملکرد ضعیف در دسترسی یکنواخت: عملکرد درخت گسترده به‌طور قابل توجهی بدتر از درخت جستجوی دودویی متعادل ساده برای دسترسی یکنواخت است.
* یکی از بدترین حالت‌های الگوریتم درخت گسترده دسترسی ترتیبی به همه عناصر در درخت مرتب شده‌است که درخت را کاملاً نامتعادل می‌کند (این n دسترسی دارد که هرکدام از <math>O(lg n)</math>است). دوباره مورد دسترسی قرار دادن عنصر اول، باعث می‌شود که عملیاتی که از <math>O(n)</math> است اجرا شود تا درخت دوباره متوازن شود (قبل بازگشت عنصر اول). این تأخیر قابل توجهی برای عملیات نهایی است، با این حال، تحقیقات اخیر نشان می‌دهد که متعادل‌سازی تصادفی می‌تواند از اثر عدم تعادل جلوگیری کند و بازدهی مشابه سایر الگوریتم‌های خود متوازن بدهد.


== عملیات‌های گسترش ==
هنگامی که یک گره x مورد دسترسی قرار میگیرد، ساختار درختی splay روی آن انجام می‌شود تا آن را در ریشه قرار دهد. برای این مقصود یک توالی از Splay Steps به‌انجام می‌رسد که هر مرحله این حرکت را بیش‌تر پیش می‌برد. و x را به ریشه نزدیکتر می کند. با انجام عملیات splay در گره مورد نظر بعد از هر دسترسی ، گره ای که اخیرا مورد دسترسی قرار گرفته در نزدیکی ریشه درخت نگه داشته می‌شود و تقریبا متعادل باقی می ماند .


=== گسترش ===
هر مرحله به سه عامل بستگی دارد :
هنگامی که یک گره ''x'' مورد دسترسی قرار می‌گیرد، ساختار درختی گسترده روی آن انجام می‌شود تا آن را در ریشه قرار دهد. برای این مقصود یک توالی از مرحله‌های گسترش به‌انجام می‌رسد که هر مرحله این حرکت را بیش‌تر پیش می‌برد؛ و ''x'' را به ریشه نزدیکتر می‌کند. با انجام عملیات گسترش در گره مورد نظر بعد از هر دسترسی، گره‌ای که اخیراً مورد دسترسی قرار گرفته در نزدیکی ریشه درخت نگه داشته می‌شود و تقریباً متعادل باقی می‌ماند.


هر مرحله به سه عامل بستگی دارد:
*آیا x فرزند چپ یا راست گره پدر خود p است ،
*آیا گره p ریشه است یا نه ، و اگر نه
* آیا ''x'' فرزند چپ یا راست [[گره پدر]] خود ''p'' است،
*آیا گره p فرزند چپ یا راست پدر خود g است ، (g پدربزرگ x می شود).
* آیا گره ''p'' ریشه‌است یا نه، و اگر نه
* آیا گره ''p'' فرزند چپ یا راست پدر خود ''g'' است، (''g'' پدربزرگ ''x'' می‌شود).


سه مرحله splayعبارتند از :
سه مرحله گسترش عبارتند از:


====مرحله zig====
==== مرحله زیگ ====
این مرحله هنگامی انجام می گیرد که p ریشه باشد .درخت بر روی لبه بین x و p می چرخد.این مرحله برای مواجه با مسئله parity وجود دارد و تنها به عنوان آخرین مرحله ،زمانی که x دارای عمق فرد در آغاز عملیات است ،اجرا می شود.
این مرحله هنگامی انجام می‌گیرد که ''p'' ریشه باشد. درخت بر روی لبه بین ''x'' و ''p'' می‌چرخد. این مرحله برای متوازن کردن درخت به‌وجود آمده‌است و تنها به عنوان آخرین مرحله، زمانی که ''x'' دارای عمق فرد در آغاز عملیات است، اجرا می‌شود.
[[پرونده:Splay tree zig.svg|وسط]]


==== مرحله زیگ-زاگ ====
این مرحله هنگامی اجرا می‌شود که ''p'' ریشه نباشد و ''x'' فرزند راست و ''p'' فرزند چپ باشد (یا بر عکس). درخت ابتدا روی لبه بین ''x'' ,''p'' دوران می‌کند و سپس روی لبه بین ''x'' و پدر جدیدش ''g'' دوران می‌کند.
[[پرونده:Zigzag.gif|وسط]]


==== مرحله زیگ-زیگ ====
[[تصویر:Zig.gif]]
این مرحله وقتی اجرا می‌شود که ''p'' ریشه نباشد و هر دوی ''x'' و ''p'' فرزندان راست یا چپ باشند. درخت ابتدا روی لبه اتصال ''p'' با پدرش ''g''، و سپس روی لبه اتصال ''x'' با ''p'' دوران می‌کند. مراحل زیگ‌-زیگ تنها چیزی است که ساختارهای درختی درهم را از روش معرفی شده از سوی آلن و مونرو متمایز می‌سازند.{{نیازمند منبع}}
[[پرونده:Zigzig.gif|وسط]]


====مرحله zig-zag====
=== درج ===
برای درج گره x به درخت اسپلی، ما ابتدا آن را مانند [[درخت دودویی]] جستجوی نرمال درج می‌کنیم. سپس با الگوریتم اسپلی گره جدید را به بالای درخت می‌آوریم.
این مرحله هنگامی اجرا می‌شود که p ریشه نباشد و x فرزند راست و p فرزند چپ باشد (یا بر عکس) .درخت ابتدا روی لبه بین x ,p دوران می‌کند و سپس روی لبه بین x و پدر جدیدش g دوران می کند.


=== حذف ===
[[پرونده:Zigzag.gif]]
برای حذف گره از همان روش درخت دودویی جستجو استفاده می‌کنیم. اگر x دو بچه داشت، ما مقدار آن را با راست‌ترین گرهٔ زیر درخت چپ آن یا چپ‌ترین گرهٔ زیر درخت راست آن جایگزین می‌کنیم. سپس آن گره را حذف می‌کنیم. در این روش پاک کردن، به حذف گره با ۰ یا ۱ بچه کاهش می‌یابد. پس از حذف، پدر گرهٔ حذف شده را به بالای درخت می‌آوریم.


== برنامه درخت اسپلی به زبان C ==
====مرحله Zig-zig====
در برنامهٔ زیر ایده ساختن درخت اسپلی، به زبان C است:

X گره‌ای است که عملیات اسپلی روی آن اجرا می‌شود و root ریشه درخت است.
این مرحله وقتی اجرا می‌شود که p ریشه نباشد و x و p هر دو فرزندان راست یا چپ باشند.تصویر زیر حالتی را نشان می دهد که x ,p هر دو فرزندان چپ هستند.درخت ابتدا روی لبه اتصال p با پدرش g ، و سپس روی لبه اتصال xبا p دوران می کند.
مراحل زیگ‌زیگ تنها چیزی هستند که ساختارهای درختی درهم را از Retate to Root معرفی شده از سوی آلن و مونرو متمایز می‌سازند.

[[تصویر:Zigzig.gif]]

==درج==
برای درج گره x به درخت اسپلی،ما ابتدا آن را مانند درخت دودویی جستجوی نرمال درج می کنیم .سپس با الگوریتم اسپلی گره جدید را به بالای درخت می آوریم.

==حذف==
برای حذف گره x ،از همان روش درخت دودویی جستجو استفاده می کنیم.اگر x دو بچه داشت ،ما مقدار آن را با راست‌ترین گرهٔ زیر درخت چپ آن (in-order predecessor )یا چپ‌ترین گرهٔ زیر درخت راست آن (in-order successor )جایگزین می کنیم.سپس آن گره را حذف می کنیم.در این روش پاک کردن ،به حذف گره با 0 یا 1 بچه کاهش می یابد.پس از حذف، پدر گرهٔ حذف شده را به بالای درخت می آوریم.
==برنامه درخت اسپلی به زبان C==
در برنامهٔ زیر ایده ساختن درخت اسپلی ،به زبان C است:
X گره ای است که عملیات اسپلی روی آن اجرا می‌شود و root ریشه درخت است.
{{چپ چین}}


<syntaxhighlight lang="c">
void splay (struct node *x, struct node *root
void splay (struct node *x, struct node *root
{
{
node *p,*g;
node *p,*g;
/*check if node x is the root node*/
/*check if node x is the root node*/
if(x==root);
if(x==root);
/*Performs Zig step*/
/*Performs Zig step*/
else if(x->parent==root)
else if(x->parent==root)
{
{
if(x==(x->parent)->left)
if(x==(x->parent)->left)
rightrotation(root);
rightrotation(root);
else
else
leftrotation(root);
leftrotation(root);
}
}
else
else
{
{
p=x->parent; /*now points to parent of x*/
p=x->parent; /*now points to parent of x*/
g=p->parent; /*now points to parent of x's parent*/
g=p->parent; /*now points to parent of x's parent*/
/*Performs the Zig-zig step when x is left and x's parent is left*/
/*Performs the Zig-zig step when x is left and x's parent is left*/
if(x==p->left&&p==g->left)
if(x== p->left&&p ==g->left)
{
{
rightrotation(g);
rightrotation(g);
rightrotation(p);
rightrotation(p);
}
}
/*Performs the Zig-zig step when x is right and x's parent is right*/
/*Performs the Zig-zig step when x is right and x's parent is right*/
else if(x==p->right&&p==g->right)
else if(x== p->right&&p ==g->right)
{
{
leftrotation(g);
leftrotation(g);
leftrotation(p);
leftrotation(p);
}
}
/*Performs the Zig-zag step when x's is right and x's parent is left*/
/*Performs the Zig-zag step when x's is right and x's parent is left*/
else if(x==p->right&&p==g->left)
else if(x== p->right&&p ==g->left)
{
{
leftrotation(p);
leftrotation(p);
rightrotation(g);
rightrotation(g);
}
}
/*Performs the Zig-zag step when x's is left and x's parent is right*/
/*Performs the Zig-zag step when x's is left and x's parent is right*/
else if(x==p->left&&p==g->right)
else if(x== p->left&&p ==g->right)
{
{
rightrotation(p);
rightrotation(p);
leftrotation(g);
leftrotation(g);
}
}
splay(x, root);
splay(x, root);
}
}
}
}
</syntaxhighlight>


{{پایان چپ‌چین}}
== منابع ==
{{پانویس}}
{{چپ‌چین}}
* http://en.wikipedia.org/wiki/Splay_tree
* http://www.cs.gsu.edu/~skarmakar/cs3410/slide22.pdf
* http://ce.sharif.edu/~ghodsi/ds-alg-dic/dads-orig
{{پایان چپ‌چین}}
{{درخت‌ها در علوم کامپیوتر}}{{ساختمان داده‌ها}}
<link rel="mw:PageProp/Category" href="./رده:مهندسی_نرم‌افزار" />


[[رده:جستجوی درخت‌ها]]
==منابع==
[[رده:درخت‌های دودویی]]
{{چپ چین}}
http://en.wikipedia.org/wiki/Splay_tree
http://www.cs.gsu.edu/~skarmakar/cs3410/slide22.pdf

http://ce.sharif.edu/~ghodsi/ds-alg-dic/dads-orig
[[رده:مهندسی نرم‌افزار]]
[[رده:ساختار درختی]]
[[رده:ساختار درختی]]
[[رده:داده ساختارهای استهلاکی]]

[[en:Splay tree]]

نسخهٔ کنونی تا ‏۲۷ دسامبر ۲۰۲۳، ساعت ۱۲:۰۷

درخت گسترده (به انگلیسی: Splay tree) یک درخت جستجوی دودویی خود متوازن است؛ که قابلیت اصلی آن تسهیل فرایند دسترسی به اطلاعاتی است که جدیداً به آن‌ها مراجعه کرده‌ایم. این درخت اعمال اصلی مانند درج و جستجو و حذف را درانجام می‌دهد. برای بسیاری از دنباله‌های غیر تصادفی، این درخت بهتر از سایر درخت‌های جستجو عمل می‌کند. درخت اسپلی توسط دانیل اسلیتور و رابرت تارجان در سال ۱۹۸۵ ابداع شد.

در این درخت همهٔ عملیات معمول در درخت جستجوی دودویی با عمل پایه گسترش ترکیب می‌شوند. به این معنی که برای یک عنصر خاص درخت را باز می‌آراید تا عنصر در ریشهٔ درخت قرار بگیرد. یک راه انجام این کار این است که ابتدا یک جستجو برای یافتن عنصر مورد نظر انجام دهیم و سپس آن را به بالای درخت برسانیم.

مزایا

[ویرایش]
  • کارایی بهتر: کارایی بهتر برای یک درخت گسترده به خود متوازنی آن بستگی دارد و به این که عناصری که بارها دسترسی یافته‌اند به ریشه نزدیکتر شوند تا سریعتر مورد دسترسی قرار بگیرند. این تقریباً برای تمام کاربردهای عملی این ساختار مزیتی است که برای پیاده‌سازی حافظه نهان و الگوریتم بازیافت حافظه بسیار مفید است. این ساختار هنگامی کارآمدتر خواهد بود که دسترسی به صورت یک‌پارچه نباشد.
  • پیاده‌سازی ساده‌تر: پیاده‌سازی ساده‌تری نسبت به دیگر درخت‌های جستجوی دودویی خود متوازن، مانند درخت قرمز سیاه یا درخت ای‌وی‌ال دارد.
  • امکان ایجاد یک نسخه پایدار: که اجازه دسترسی به هر دو نسخه قبلی و جدید را پس از بروزرسانی می‌دهد. این می‌تواند در برنامه‌نویسی تابعی مفید باشد و به فضا در هر بروزرسانی نیاز دارد.
  • بر خلاف سایر انواع درختان خود متوازن به خوبی با گره حاوی کلیدهای هویت کار می‌کند. حتی با وجود کلیدهای هویت، عملکرد در باقی می‌ماند. یک طراحی دقیق عملیات پیدا کردن می‌تواند چپ‌ترین یا راست‌ترین گرهٔ کلید داده شده را برگرداند.

معایب

[ویرایش]
  • درختانی می‌توانند وجود داشته باشند که توزیع دادهٔ ورودی را کمی سریع‌تر انجام می‌دهند.
  • عملکرد ضعیف در دسترسی یکنواخت: عملکرد درخت گسترده به‌طور قابل توجهی بدتر از درخت جستجوی دودویی متعادل ساده برای دسترسی یکنواخت است.
  • یکی از بدترین حالت‌های الگوریتم درخت گسترده دسترسی ترتیبی به همه عناصر در درخت مرتب شده‌است که درخت را کاملاً نامتعادل می‌کند (این n دسترسی دارد که هرکدام از است). دوباره مورد دسترسی قرار دادن عنصر اول، باعث می‌شود که عملیاتی که از است اجرا شود تا درخت دوباره متوازن شود (قبل بازگشت عنصر اول). این تأخیر قابل توجهی برای عملیات نهایی است، با این حال، تحقیقات اخیر نشان می‌دهد که متعادل‌سازی تصادفی می‌تواند از اثر عدم تعادل جلوگیری کند و بازدهی مشابه سایر الگوریتم‌های خود متوازن بدهد.

عملیات‌های گسترش

[ویرایش]

گسترش

[ویرایش]

هنگامی که یک گره x مورد دسترسی قرار می‌گیرد، ساختار درختی گسترده روی آن انجام می‌شود تا آن را در ریشه قرار دهد. برای این مقصود یک توالی از مرحله‌های گسترش به‌انجام می‌رسد که هر مرحله این حرکت را بیش‌تر پیش می‌برد؛ و x را به ریشه نزدیکتر می‌کند. با انجام عملیات گسترش در گره مورد نظر بعد از هر دسترسی، گره‌ای که اخیراً مورد دسترسی قرار گرفته در نزدیکی ریشه درخت نگه داشته می‌شود و تقریباً متعادل باقی می‌ماند.

هر مرحله به سه عامل بستگی دارد:

  • آیا x فرزند چپ یا راست گره پدر خود p است،
  • آیا گره p ریشه‌است یا نه، و اگر نه
  • آیا گره p فرزند چپ یا راست پدر خود g است، (g پدربزرگ x می‌شود).

سه مرحله گسترش عبارتند از:

مرحله زیگ

[ویرایش]

این مرحله هنگامی انجام می‌گیرد که p ریشه باشد. درخت بر روی لبه بین x و p می‌چرخد. این مرحله برای متوازن کردن درخت به‌وجود آمده‌است و تنها به عنوان آخرین مرحله، زمانی که x دارای عمق فرد در آغاز عملیات است، اجرا می‌شود.

مرحله زیگ-زاگ

[ویرایش]

این مرحله هنگامی اجرا می‌شود که p ریشه نباشد و x فرزند راست و p فرزند چپ باشد (یا بر عکس). درخت ابتدا روی لبه بین x ,p دوران می‌کند و سپس روی لبه بین x و پدر جدیدش g دوران می‌کند.

مرحله زیگ-زیگ

[ویرایش]

این مرحله وقتی اجرا می‌شود که p ریشه نباشد و هر دوی x و p فرزندان راست یا چپ باشند. درخت ابتدا روی لبه اتصال p با پدرش g، و سپس روی لبه اتصال x با p دوران می‌کند. مراحل زیگ‌-زیگ تنها چیزی است که ساختارهای درختی درهم را از روش معرفی شده از سوی آلن و مونرو متمایز می‌سازند.[نیازمند منبع]

درج

[ویرایش]

برای درج گره x به درخت اسپلی، ما ابتدا آن را مانند درخت دودویی جستجوی نرمال درج می‌کنیم. سپس با الگوریتم اسپلی گره جدید را به بالای درخت می‌آوریم.

حذف

[ویرایش]

برای حذف گره x، از همان روش درخت دودویی جستجو استفاده می‌کنیم. اگر x دو بچه داشت، ما مقدار آن را با راست‌ترین گرهٔ زیر درخت چپ آن یا چپ‌ترین گرهٔ زیر درخت راست آن جایگزین می‌کنیم. سپس آن گره را حذف می‌کنیم. در این روش پاک کردن، به حذف گره با ۰ یا ۱ بچه کاهش می‌یابد. پس از حذف، پدر گرهٔ حذف شده را به بالای درخت می‌آوریم.

برنامه درخت اسپلی به زبان C

[ویرایش]

در برنامهٔ زیر ایده ساختن درخت اسپلی، به زبان C است: X گره‌ای است که عملیات اسپلی روی آن اجرا می‌شود و root ریشه درخت است.

void splay (struct node *x, struct node *root
{
        node *p,*g;
        /*check if node x is the root node*/
        if(x==root);
        /*Performs Zig step*/
        else if(x->parent==root)
        {  
                if(x==(x->parent)->left)
                rightrotation(root);
                else
                leftrotation(root);
        }     
        else  
        {     
                p=x->parent; /*now points to parent of x*/
                g=p->parent; /*now points to parent of x's parent*/
                /*Performs the Zig-zig step when x is left and x's parent is left*/
                if(x== p->left&&p ==g->left)
               {  
                       rightrotation(g);
                       rightrotation(p);
               }
               /*Performs the Zig-zig step when x is right and x's parent is right*/
               else if(x== p->right&&p ==g->right)
               {      
                       leftrotation(g);
                       leftrotation(p);
               }   
               /*Performs the Zig-zag step when x's is right and x's parent is left*/
               else if(x== p->right&&p ==g->left)
               {      
                       leftrotation(p);
                       rightrotation(g);
               }   
               /*Performs the Zig-zag step when x's is left and x's parent is right*/
               else if(x== p->left&&p ==g->right)
               {      
                       rightrotation(p);
                       leftrotation(g);
               }
               splay(x, root);
       }
}

منابع

[ویرایش]


<link rel="mw:PageProp/Category" href="./رده:مهندسی_نرم‌افزار" />