تالار گفتمان مانشت
[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - نسخه‌ی قابل چاپ

صفحه‌ها: ۱ ۲
[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - yaser_ilam_com - 05 اردیبهشت ۱۳۹۱ ۱۲:۳۵ ق.ظ

پیمایش درخت های دودویی


  • به هنگام پیمایش یک درخت دودویی، با هر گره و زیردرختانش به طرز مشابهی رفتار می کنیم. اگر (R(Right) ، V(Visit)، L(Left به ترتیب حرکت به چپ، ملاقات کردن یک گره (برای مثال، چاپ فیلد داده آن گره) و حرکت به راست باشد، آنگاه شش ترکیب ممکن برای پیمایش یک درخت خواهیم داشت:

    RLV ، RVL ، VRL ، VLR ، LRV ، LVR

  • اگر تنها حالتی را انتخاب کنیم که ابتدا به سمت چپ و بعد به سمت راست برود، تنها سه ترکیبVLR ، LRV ، LVR را خواهیم داشت. این سه حالت را با توجه به موقعیت V نسبت به L و R به ترتیب preorder ، postorder ، inorder می نامیم.

  • هنگامی که پیمایش Inorder انتخاب می شود، حرکت به سمت پایین و به طرف چپ انجام می شود و این عمل تا آخرین گره صورت می گیرد، سپس می توان گره را ملاقات کرد و بعد به سمت راست رفته و به همین ترتیب کار ادامه پیدا می کند. این پیمایش متناظر با شکل infix یک عبارت است.

نقل قول: تابع پیمایش Inorder
کد:
void inOrder(BinaryTreeNode *t)
{
     if (t != null)
     {
        inOrder(t -> leftChild);
        cout << t -> data;    // Visit = Print
        inOrder(t -> rightChild);
     }
}

  • بر اساس پیمایش Preorder ، گره را ابتدا بازیابی و ملاقات نموده و سپس انشعابات چپ را دنبال و تمام گره ها را بازیابی می کنیم. این فرآیند ادامه پیدا می کند تا به یک گره تهی برسیم. در این نقطه، به نزدیکترین پدر (جدی) که دارای یک فرزند راست باشد مراجعه و با این گره کار را مانند قبل ادامه خواهیم داد.

نقل قول: تابع پیمایشPreorder
کد:
void preOrder(BinaryTreeNode *t)
{
     if (t != null)
     {
        cout << t -> data;        // Visit = Print
        preOrder(t -> leftChild);  
        preOrder(t -> rightChild);
     }
}

  • پیمایش Postorder دو فرزند یک گره را قبل از بازیابی آن گره ملاقات و چاپ می کند. این مساله بدین مفهوم است که فرزندان یک گره قبل از خود آن گره بازیابی می گردد.

نقل قول: تابع پیمایشPostorder
کد:
void postOrder(BinaryTreeNode *t)
{
     if (t != null)
     {
        postOrder(t -> leftChild);    
        postOrder(t -> rightChild);
        cout << t -> data;        // Visit = Print
     }
}

  • پیمایش های inorder، preorder، postorder چه به صورت بازگشت پذیر نوشته یا به صورت غیربازگشتی، همگی نیازمند پشته می باشند.


مثال های مربوط به این سه پیمایش

منبع :مهدی ایل بیگی
دانشگاه آزاد اسلامی دماوند


RE: [نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - yaser_ilam_com - 05 اردیبهشت ۱۳۹۱ ۰۲:۳۷ ق.ظ

  • پیمایش ترتیب سطحی، ابتدا ریشه را بازیابی می کند سپس فرزند چپ ریشه و به دنبال آن فرزند راست ریشه بازیابی می گردد. این شیوه با بازیابی از گره منتهی الیه سمت چپ به سمت راست هر سطح جدید تکرار می گردد. این پیمایش از صف استفاده می کند.
  • با داشتن پیمایش میانوندی و پیشوندی یک درخت دودویی، می توان درخت را بصورت یکتا ترسیم کرد.
  • برای این منظور ابتدا رشته پیمایش پیشوندی را از چپ به راست بررسی می نماییم و ریشه درخت را بدست می آوریم. سپس با توجه به جایگاه این گره در پیمایش میانوندی، گره های زیردرخت های چپ و راست را مشخص می نماییم.
  • در ادامه رشته پیمایش پیشوندی را بترتیب از چپ به راست بررسی کرده و به روش فوق درخت را تشکیل می دهیم.
  • با داشتن پیمایش میانوندی و پسوندی یک درخت دودویی، می توان درخت را بصورت یکتا ترسیم کرد.
  • برای این منظور مانند ساخت درخت با استفاده از پیمایش میانوندی و پیشوندی عمل می نماییم با این تفاوت که پیمایش پسوندی را از راست به چپ بررسی می نمایی و...با داشتن پیمایش میانوندی و پسوندی یک درخت دودویی، می توان درخت را بصورت یکتا ترسیم کرد.
  • برای این منظور مانند ساخت درخت با استفاده از پیمایش میانوندی و پیشوندی عمل می نماییم با این تفاوت که پیمایش پسوندی را از راست به چپ بررسی می نمایی و...
  • با داشتن پیمایش پیشوندی و پسوندی یک درخت دودویی، در اغلب اوقات نمی توان درخت را بصورت یکتا ترسیم کرد. در واقع برای گره های تک فرزندی نمی توان مشخص نمود که فرزند گره، در سمت راست گره پدر قرار دارد یا در سمت چپ آن.
  • پس با داشتن پیمایش پیشوندی و پسوندی در صورتی که درخت دودویی دارای n گره تک فرزندی باشد [tex]2^{n}[/tex] درخت متفاوت می توان ایجاد نمود.



منبع : مهدی ایل بیگی
دانشگاه آزاد اسلامی دماوند


[نکات] تکمیلی BST , Heap,Graph دنباله ساختمان داده - yaser_ilam_com - 08 اردیبهشت ۱۳۹۱ ۰۴:۵۱ ق.ظ

هیپ فیبوناتچی

  • در علوم کامپیوتر، هیپ فیبوناتچی به داده ساختار هیپی اطلاق می شود که شامل انبوهی از درخت ها است. این هیپ زمان اجرای سرشکن بهتری نسبت به هیپ دوجمله ای دارد. ایده نام هیپ فیبوناتچی از اعداد فیبوناتچی که در اجرای تحلیل زمانی از آن استفاده می شود، گرفته شده است.
  • اعمال درج، یافتن کوچکترین مقدار، کاهش کلید، و ادغام(الحاق) در زمان سرشکن ثابت کار می کنند. اعمال حذف و حذف کوچکترین مقدار در زمان سرشکن [tex]O(lgn)[/tex] کار می کنند. این بدین معناست که با شروع از یک داده ساختار خالی، a عمل از دستورات گروه اول و b عمل از دستورات گروه دوم، زمان اجرای [tex]O(a blgn)[/tex] خواهد داشت. در هیپ های دو جمله انجام چنین عملی نیاز به زمان [tex]O((a b)lgn)[/tex] اجرای دارد. بنابراین زمانی که b از a کوچکتر باشد استفاده از هیپ فیبوناتچی به مراتب بهتر از استفاده از هیپ دوجمله ای است.
  • استفاده از هیپ های فیبوناتچی برای صف های اولویت دار زمان اجرای بعضی از الگوریتم های مهم را بهبود می بخشد، مثل الگوریتم دیکسترا برای محاسبه کوتاهترین مسیر در گراف، و یا الگوریتم پریم برای محاسبه درخت فراگیر مینیمم در یک گراف.


منبع : به نظر از ویکی پدیا