کلون کردن درخت دودویی با اشاره گرهای تصادفی – راهنمای کاربردی


در این مطلب، چگونگی «کلون کردن درخت دودویی با اشاره گرهای تصادفی» (Clone a Binary Tree with Random Pointers) بیان و پیادهسازی آن در زبان برنامهنویسی ++C انجام شده است. در اینجا، منظور از کلون کردن در واقع کپی کردن است.
کلون کردن درخت دودویی با اشاره گرهای تصادفی
یک «درخت دودویی» (Binary Tree) داده شده که در آن هر «گره» (Node)، دارای ساختار زیر است.
اشارهگر تصادفی به هر گره تصادفی از درخت دودویی اشاره دارد و حتی میتواند به Null نیز اشاره و درخت دودویی داده شده را کلون کند.
روش ۱: استفاده از درهمسازی
ایده نهفته در پس روش استفاده از «درهمسازی» (Hash) آن است که نگاشت گرههای درخت داده شده را در «جدول هش» (Hashtable) ذخیره کند. در ادامه، گامهای انجام این کار همراه با جزئیات بیان شدهاند.
۱. به صورت بازگشتی، درخت دودویی داده شده را پیمایش و مقادیر کلید، اشاره گر چپ و اشاره گر راست را برای کلون کردن درخت کپی کن. در حین کپی، نگاشت را از گره درخت داده شده به گره درخت کلون شده در جدول هش ذخیره کن. در شبه کد زیر، «cloneNode» گره کنونی مشاهده شده از درخت کلون و «treeNode» گره کنونی مشاهده شده از درخت داده شده است.
cloneNode->key = treeNode->key cloneNode->left = treeNode->left cloneNode->right = treeNode->right map[treeNode] = cloneNode
۲. به صورت بازگشتی، هر دو درخت را پیمایش کن و نقاط تصادفی را با استفاده از ورودیهای جدول هش تنظیم کن.
در ادامه، پیادهسازی ++C ایده بالا، ارائه شده است. پیادهسازی که در ادامه آمده از unordered_map از STL استفاده کرده است.
خروجی قطعه کد بالا، به صورت زیر است.
Inorder traversal of original binary tree is: [4 1], [2 NULL], [5 3], [1 5], [3 NULL], Inorder traversal of cloned binary tree is: [4 1], [2 NULL], [5 3], [1 5], [3 NULL],
روش ۲: ویرایش موقت درخت دودویی داده شده
الگوریتم این روش، در ادامه آمده است.
۱. گرههای جدید را در درخت کلون شده بساز و هر گره جدید را در درخت اصلی، بین لبه اشارهگر چپ از گره متناظر درج کن. (مشاهده تصویر زیر، برای درک بهتر این موضوع، توصیه میشود.)
اگر کره کنونی A و فرزند سمت چپ آن B است (A — >> B)، گره جدید کلون شده با کلید A ساخته میشود (cA) و به عنوان A — >> cA — >> B قرار داده میشود (B میتواند نال یا فرزند غیر نال سمت چپ باشد). اشارهگر فرزند سمت راست به درستی تنظیم میشود. اگر برای فرزند کنونی A، فرزند راست در درخت اصلی C است (A — >> C)، سپس، گرههای کلون شده متناظر cA و cC مشابه cA —- >> cC هستند.
۲. تنظیم اشارهگر تصادفی در درخت کلون شده به ازای درخت اصلی.
اگر اشارهگر تصادفی A به گره B اشاره کند، در درخت کلون شده، cA به cB اشاره میکند (cA و cB گرههای جدید در درخت کلون شده و متناظر با گرههای A و B در درخت اصلی هستند).
۳. اشارهگرهای سمت چپ را به درستی در درخت اصلی و درخت کلون شده، بازیابی کن.
در ادامه، پیادهسازی الگوریتم بالا در زبان برنامهنویسی ++C ارائه شده است.
خروجی قطعه کد بالا، به صورت زیر است.
Inorder traversal of original binary tree is: [5 9], [6 7], [7 NULL], [8 10], [9 7], [10 6], [11 9], [12 8], [13 NULL], Inorder traversal of cloned binary tree is: [5 9], [6 7], [7 NULL], [8 10], [9 7], [10 6], [11 9], [12 8], [13 NULL],
اگر نوشته بالا برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش ساختمان دادهها
- مجموعه آموزشهای ساختمان داده و طراحی الگوریتم
- یافتن دور همیلتونی با الگوریتم پس گرد — به زبان ساده
- الگوریتم بازی مار و پله همراه با کد — به زبان ساده
- حل مساله n وزیر با الگوریتم پسگرد (Backtracking) — به زبان ساده
^^