تشریح الگوریتم:
سیستم کد رفرال بانکی را تصور بفرمایید (مثل بلو بانک) با تفاوت های زیر:
این کار تا زمانی ادامه یابد که سمتی انتخاب شود و پوزیشن کاربری که دعوت شده، مشخص شده و در دیتابیس ثبت شود.
نمونه کد فعلی که کمک کند به این ترتیب است و شماتیک دیتابیس رو زیر متن قرار میدم.
if ($direct['right_id'] == 0) {
}elseif($direct['left_id'] ==0({
}else{
///// اینجا باید اون حلقه با شرط بیاد...
}
اگر بخواهیم الگوریتم ثبت کاربر جدید در دیتابیس را با شرایط "حلقه و شرط تو در تو" در PHP پیاده سازی کنیم، میتوانیم از قطعات کد زیر استفاده کنیم:
if ($direct['right_id'] == 0) {
// جایگاه راست خالی است
// کاربر جدید را به عنوان فرزند راست برای کد دعوت کننده ثبت کنید.
} elseif ($direct['left_id'] == 0) {
// جایگاه چپ خالی است
// کاربر جدید را به عنوان فرزند چپ برای کد دعوت کننده ثبت کنید.
} else {
// هر دو جایگاه پر است
$node = $direct; // نود راست را به عنوان مبدأ انتخاب میکنیم
while (true) {
if ($node['right_id'] == 0) {
// جایگاه راست خالی است
// کاربر جدید را به عنوان فرزند راست برای کد دعوت کننده ثبت کنید.
break;
} elseif ($node['left_id'] == 0) {
// جایگاه چپ خالی است
// کاربر جدید را به عنوان فرزند چپ برای کد دعوت کننده ثبت کنید.
break;
} else {
// هر دو جایگاه پر است، یک زیرمجموعه جدید انتخاب میکنیم.
if ($node['rbalance'] <= $node['lbalance']) {
$node = getRightSubtree($node);
} else {
$node = getLeftSubtree($node);
}
}
}
}
در شرط سوم که هر دو جایگاه پر باشند، از یک حلقه while استفاده میکنیم تا پایینترین زیرمجموعهی خالی را پیدا کنیم. در هر مرحله، با توجه به بالانس حسابهای راست و چپ، یکی از زیرمجموعههای راست یا چپ را به عنوان مبدأ انتخاب میکنیم و به دنبال پایینترین زیرمجموعه خالی در آن بخش میگردیم. سپس در نهایت، کاربر جدید را به عنوان فرزند جدید برای آن جایگاه ثبت میکنیم.
در پایان، برای ثبت کاربر جدید در دیتابیس، با استفاده از تابعی به نام insertNewUser، پارامترهای مناسب به دیتابیس اضافه میشوند.
function insertNewUser($name, $family, $rcode, $parent_id, $position, $rbalance, $lbalance, $lvl) {
// کاربر جدید را با استفاده از پارامترهای ورودی در دیتابیس ثبت کنید.
}
تابع getRightSubtree برای پیدا کردن پایینترین زیرمجموعه خالی در زیردرخت راست نود ورودی استفاده میشود. این تابع به صورت زیر پیاده سازی میشود:
function getRightSubtree($node) {
$right_id = $node['right_id'];
while (true) {
$right_node = getUserById($right_id);
if ($right_node['left_id'] == 0) {
// پایینترین زیرمجموعه خالی در زیردرخت چپ همین نود است.
return $right_node;
} else {
// بازگشت به سمت پایین
$right_id = $right_node['left_id'];
}
}
}
در هر مرحله، با استفاده از تابع getUserById، اطلاعات نود با شناسهٔ $rightid را از دیتابیس بخوانید. سپس اگر جایگاه چپ آن نود خالی باشد، پایینترین زیرمجموعه خالی در زیردرخت راست همان نود فعلی است و مقدار آن را به عنوان خروجی تابع برگردانید.
اگر جایگاه چپ آن نود پر باشد، بازگشت به سمت پایین انجام داده و شناسهٔ نود چپ آن را به عنوان $rightid قرار داده و مجدداً اطلاعات آن را از دیتابیس بخوانید. این کار را تا زمانی ادامه دهید که پایینترین زیرمجموعه خالی در زیردرخت راست پیدا شود.
تابع getLeftSubtree هم به صورت مشابه برای پیدا کردن پایینترین زیرمجموعه خالی در زیردرخت چپ نود ورودی استفاده میشود. این تابع به صورت زیر پیاده سازی میشود:
function getLeftSubtree($node) {
$left_id = $node['left_id'];
while (true) {
$left_node = getUserById($left_id);
if ($left_node['right_id'] == 0) {
// پایینترین زیرمجموعه خالی در زیردرخت راست همین نود است.
return $left_node;
} else {
// بازگشت به سمت پایین
$left_id = $left_node['right_id'];
}
}
}
در این تابع، ابتدا شناسهٔ نود چپ را از ورودی تابع میگیریم ($leftid) و از یک حلقه while استفاده میکنیم تا پایینترین زیرمجموعه خالی در زیردرخت ..
و بعدش هم پیشنهاد میکنم تمام مباحث رو برای اینکه بهتر یادبگیری و بتونی تست کنی سری به سایت زیر بزن و با chatGPT کار کن برای سوال و جوابات.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟