1 / 36

درخت

جلسه هفتم. به نام خداوند هستی بخش یگانه. درخت. TREE. A.M. Safaei. جلسه هفتم. درخت ها. تعریف درخت مجموعه محدودی از یک گره ( NODE ) یا چند گره که بصورت زیر تعریف شود: دارای گره ای خاص به نام ریشه ( Root ) باشد.

Download Presentation

درخت

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. جلسه هفتم به نام خداوند هستی بخش یگانه درخت TREE A.M. Safaei

  2. جلسه هفتم درخت ها • تعریف درخت • مجموعه محدودی از یک گره (NODE) یا چند گره که بصورت زیر تعریف شود: • دارای گره ای خاص به نام ریشه (Root) باشد. • بقیه گره ها به مجموعه های مجزای T1, …, Tn تقسیم شده که هر یک از این مجموعه ها خود یک درخت است و T1, …, Tn زیر درخت های ریشه نامیده می شوند. • انواع درخت : 1- درخت های عمومی 2- درخت های دودویی • درخت دودویی (Binary Tree) : درختی است که هر گره آن حداکثر دو فرزند داشته باشد، درختی که دودویی نباشد درخت عمومی می باشد.

  3. جلسه هفتم درخت ها • اصطلاحات مربوط به درخت ها • گره (Node): به عناصر موجود در درخت گره گویند. مثل A,B,C,… در مثال رو به رو • درجه گره (ِDegree): درجه گره برابر با تعداد فرزندان آن گره است. در مثال روبه رو گره A درجه 2 و گره C و B درجه 1 می باشند. • برگ (Leaf) : گره های پایانی، که درجه صفر دارند. • درجه درخت : درجه درخت برابر است با حداکثر درجه گره های آن درخت. مثلا درخت زیر درجه 3 می باشد. • گره های همزاد یا هم نیا (Sibiling): گره هایی که دارای پدرمشترک هستند، • بعنوان مثال؛ گره های H,I,J همزادند. • درخت K تایی : درختی که تعداد فرزندان هر گره در آن حداکثر K باشد. • درخت متوازن : درختی که اختلاف سطح برگ های آن حداکثر یک باشد. • درخت کاملا متوازن : درختی که اختلاف سطح برگ های آن صفر باشد.

  4. جلسه هفتم درخت ها • اصطلاحات مربوط به درخت ها • سطح یک گره (Level): اگر ریشه را در سطح یک در نظر بگیریم سایر گره ها بر اساس تعداد یالی که از ریشه فاصله دارند شماره سطح می گیرند، لذا گره هایی با فاصله n یا از ریشه در سطح n+1 قرار دارند. • عمق یا ارتفاع درخت (Depth): بیشترین سطح برگهای درخت را عمق گویند. در شکل زیر عمق درخت 4 است. • یال و مسیر : خطی ( پیوندی) که از یک گره به گره دیگر رسم می شود، یال و دنباله ای از یال های متوالی را یک مسیر می نامند. • طول مسیر درخت : مجموع طول های تمام مسیر ها از ریشه به تمام گره های درخت است. برای درخت زیر داریم:

  5. A B C D J E F G H I M K L جلسه هفتم درخت ها • نمایش درخت ( 1- درختی 2- پرانتزی 3- لیست پیوندی) • فرم درختی • فرم پرانتزی ( ابتدا اطلاعات ریشه و سپس در داخل پرانتزها اطلاعات فرزندان هر گره به ترتیب از چپ به راست قرار می گیرد) (A(B(E(K ،L)،F)،C(G)،D(H(M)،I،J)))

  6. A B C D J E F G H I M K L جلسه هفتم درخت ها • نمایش درخت ( 1- درختی 2- پرانتزی 3- لیست پیوندی) • فرم لیست پیوندی : هر فرزندی که برگ نباشد با اضافه کردن یک سطح به لیست به صورت زیر لیست نمایش می دهیم. (A(B(E(K,L),F),C(G),D(H(M),I,J)))

  7. جلسه هفتم درخت ها • درخت دودویی یک درخت دودویی T بصورت مجموعه ای متناهی از عناصر به نام گره ها تعریف می شود بطوری که : الف) اگر T خالی باشد به آن درخت پوچ یا تهی گویند. ب ) حاوی مجموعه ای محدود از گره ها، یک ریشه و دو زیردرخت T1 و T2 می باشد که به ترتیب به آنها زیر درخت های چپ و راست گفته می شود. • درخت دودویی مشابه : درخت T1 و T2 را مشابه گویند هرگاه دارای یک ساختار باشند بعبارت دیگر دارای یک شکل باشند. • درخت دودویی کپی : درخت T1 و T2 را کپی گویند هرگاه مشابه بوده و محتوای گره های آنها نیز یکسان باشد.

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

  9. جلسه هفتم درخت ها • انواع درخت دودویی • درخت دودویی پر (Full) • درخت دودویی است که در آن کلیه گره ها به جز گره های سطح آخر دقیقا دو فرزند داشته باشند • یک درخت دودویی پر به عمق k ، یک درخت دودویی پر است مشروط به اینكه 2k-1 گره داشته باشد. • درخت کاملا پر (Perfect) • درختی است که همه گره ها بجز گره های سطح آخر (برگها) درای حداکثر فرزندان بودن (حداکثر درجه درخت) و برگها هم سطح نیز باشند.

  10. جلسه هفتم درخت ها • خواص درخت دودویی • حداکثر تعداد گره ها • حداکثر تعداد گره ها در سطح iام یک درخت دودویی 2i-1است. • حداکثر تعداد گره ها در یک درخت دودویی به عمق k ،2k-1 است.

  11. جلسه هفتم درخت ها • خواص درخت دودویی • رابطه بین تعداد گره های برگ و گره های درجه 2 • برای هر درخت دودویی غیر تهی مانند T ، اگر n0 تعداد گره های پایانی وn2 تعداد گره های درجه 2 باشد ، آنگاه خواهیم داشت : • یعنی تعداد برگها همواره در درخت دودویی یکی بیشتر از تعداد گره های درجه 2 می باشد. مثال: در صورتی که یک درخت دودویی به عمق 6 داشته باشیم؛ اگر درخت مورب باشد حداقل 6 گره دارد و اگر درخت پر باشد حداکثر 2^6-1=63 گره خواهد داشت.

  12. جلسه هفتم درخت ها • خواص درخت دودویی • ارتفاع یك درخت دودویی كامل با n گره برابر است با : • یک درخت دودویی با n گره و عمق k کامل است ، اگر و تنها اگر گره هایش مطابق با گره های شماره گذاری شده در یک درخت دودویی پر به عمق k باشد. • حداکثر تعداد گره های غیر برگ یک درخت با عمق K برابر با خواهد بود.

  13. جلسه هفتم درخت ها • نمایش درخت دودویی • اصلی ترین موضوع در نمایش درخت T این است که به ریشه R درخت T دسترسی مستقیم داشته باشیم و با معلوم بودن هر گره از درخت T بتوان به هر فرزند آن نیز دسترسی داشته باشیم. • دو روش پیاده سازی و نمایش درخت دودویی عبارت است از: 1- روش ترتیبی درخت دودویی ( نمایش بوسیله آرایه) 2- نمایش پیوندی درخت دودویی ( نمایش بوسیله لیست پیوندی)

  14. جلسه هفتم درخت ها • نمایش درخت دودویی بوسیله آرایه برای نمایش درخت های دودویی می توان از آرایه ها استفاده کرد. بدین منظور به تعداد گره های درخت کامل متناظر با درخت مفروض برای یک آرایه حافظه نیاز داریم. در آنصورت داریم : ابتدا گره های درخت دودویی را از چپ به راست و از عدد یک به بعد شماره گذاری می کنیم. سپس محتوای هر گره درخت دودویی را با شماره خاص د رخانه ای از آرایه با همان شماره ذخیره می کنیم. برای یک درخت دودویی به عمق h به خانه از آرایه نیاز است. • ریشه در خانه اول آرایه قرار می گیرد. • فرزند سمت چپ گره ای با اندیس i در آرایه درون خانه 2i قرار می گیرد که 2i<n خواهد بود. اگر 2i>n بود یعنی گره i فرزند سمت چپ ندارد. فرزند سمت چپ = 2i • فرزند سمت راست گره ای با اندیس i در آرایه درون خانه 2i+1 آرایه قرار می گیرد که 2i+1<=n خواهد بود. اگر 2i+1>n باشد یعنی گره i فرزند سمت راست ندارد. فرزند سمت راست = 2i+1

  15. A B C F D E G H جلسه هفتم درخت ها ابتدا گره ها را به ترتیب سطحی با در نظر گرفتن جایگاه گره های خالی، شماره گذاری می نماییم. سپس هر گره را در خانه ای از آرایه که اندیس آن برابر شماره گره است می نویسیم. • نمایش درخت دودویی بوسیله آرایه 1 3 2 7 4 6 9 13

  16. جلسه هفتم درخت ها • معایب و مزایای نمایش درخت دودویی بوسیله آرایه • مزایا • استفاده از آرایه برای درخت هایی که تعداد زیادی گره دارند (درخت پر و یا کامل) بسیار مناسب است زیرا هیچ یا تعداد کمی از خانه های آرایه هدر می رود. • هر گره از طریق گره دیگری به راحتی و از طریق محاسبه اندیس قابل دستیابی است. • فقط داده ها ذخیره می شوند و نیازی به ذخیره اشاره گرهای زیر درخت چپ و راست نخواهد بود. • پیاده سازی با آرایه ساده تر است. • معایب • در نمایش درخت های دودویی بوسیله آرایه ها اگر درخت کامل نباشد مثل درخت مورب اصلا روش خوبی نیست و اتلاف حافظه خواهیم داشت. • با افزایش عمق درخت طول آرایه قابل افزایش نیست. • اعمال درج و حذف کارآمد نیست و باعث جابجایی گره ها و تغییر شماره سطح آنها می شود.

  17. Root g h e a c b d f جلسه هفتم درخت ها • نمایش پیوندی درخت های دودویی در این روش ساختار هر گره از سه قسمت زیر تشکیل شده است راست

  18. جلسه هفتم درخت ها • نمایش پیوندی درخت های دودویی • یکی از معایب نمایش پیوندی این است که توسط هر گره فقط می توان فرزندان آن را پیدا کرد. ولی یافتن پدر (Parent) یک گره ممکن نیست، لذا برای حل این مشکل می توان فیلد چهارمی بنام Parent برای ساختار در نظر گرفت. StructTreeNode { elementtype info; node *left; node *right; };

  19. جلسه هفتم درخت ها • پیمایش درخت های دودویی • دستیابی به تمام گره های درخت ( هر گره فقط یک بار) تحت یک روش مشخص را پیمایش درخت می نامند که به دو روش : 1- پیمایش سطحی (ردیفی) 2- پیمایش عمقی درخت امکاان پذیر است. 1- پیمایش سطحی • در این روش با استفاده از یک صف صورت می گیرد ابتدا ریشه، سپس فرزند چپ و بعد فرزند راست ملاقات می شود و تا زمانی که گره های یک سطح به طول کامل ملاقان نشود ملاقات گره های سطح بعد شروع نمی شود. void level_order (node *tree) { front = rear= -1; while (tree) { cout<< treeinfo; if (tree left ) addq ( treeleft ); if ( treeright ) addq ( treeright ) ; delete(tree) ; } }

  20. a b c f e d j g h i جلسه هفتم درخت ها • تمرین روش پیمایش سطحی a b c d e f g h i j Level Order =

  21. جلسه هفتم درخت ها • پیمایش درخت های دودویی 2- پیمایش عمقی • در این روش با استفاده از پشته انجام می پذیرد. اگر L را پیمایش عمقی زیردرخت چپ و V را ملاقات گره و R را پیمایش عمقی زیر درخت راست فرض کنیم؛ شش ترکیب ممکن برای پیمایش درخت دودویی داریم : RLV ، RVL ، VRL ، VLR ، LRV ، LVR • سه حالت کلی برای پیمایش عمقی درخت دودویی

  22. جلسه هفتم درخت ها • پیمایش درخت های دودویی مثال : سه حالت پیمایش عمقی درخت دودویی زیر: • = پیمایش پیشوندیa b d g c e h f i j • = پیمایش پسوندی g d b h e i j f c a • = پیمایش میاونوندیd g b a e h c i f j

  23. جلسه هفتم درخت ها • الگوریتم بازگشتی پسوندی پیمایش عمقی void Postorder (node *tree) { if ( tree) { Postorder (tree  left ); Postorder(tree right ); cout<<tree  info ; } } • = پیمایش پسوندی g d b h e i j f c a

  24. جلسه هفتم درخت ها • الگوریتم بازگشتی پیشوندی پیمایش عمقی void Preorder (node *tree) { if (tree) { cout<<tree info; Preorder (tree left ); Preorder (tree right ); } } • = پیمایش پیشوندیa b d g c e h f i j

  25. جلسه هفتم درخت ها • الگوریتم بازگشتی میانوندی پیمایش عمقی void inorder (node *tree) { if(tree) { inorder (tree left ); cout<<tree info; inorder ( treeright ); } } • = پیمایش میاونوندیd g b a e h c i f j

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

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

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

  29. a a b fjc fjc gdhbei gdh ei جلسه هفتم درخت ها میانوندی= g d h b e i a f j c پیشوندی= a b d g h e i c f j • مرحله اول ساخت درخت : • مرحله دوم ساخت گره های سمت راست : • مثال ساخت درخت دودویی از روی پیمایش میانوندی و پیشوندی

  30. a b fjc d ei g h جلسه هفتم درخت ها میانوندی= g d h b e i a f j c پیشوندی= a b d g h e i c f j • مرحله سوم ساخت درخت : • مرحله آخر: • مثال ساخت درخت دودویی از روی پیمایش میانوندی و پیشوندی a b c d e f g j i h

  31. جلسه هفتم درخت ها • ساخت درخت دودویی از روی پیمایش میانوندی و پسوندی • دستورالعمل • با داشتن پیمایش میانوندی و پسوندی یک درخت دودویی، می توان درخت را بصورت یکتا ترسیم کرد. • برای این منظور مانند ساخت درخت با استفاده از پیمایش میانوندی و پیشوندی عمل می نماییم با این تفاوت که پیمایش پسوندی را از راست به چپ بررسی می نماییم و... • نکات • با داشتن پیمایش پیشوندی و پسوندی یک درخت دودویی، در اغلب اوقات نمی توان درخت را بصورت یکتا ترسیم کرد. در واقع برای گره های تک فرزندی نمی توان مشخص نمود که فرزند گره، در سمت راست گره پدر قرار دارد یا در سمت چپ آن. • پس با داشتن پیمایش پیشوندی و پسوندی در صورتی که درخت دودویی دارای n گره تک فرزندی باشد 2nدرخت متفاوت می توان ایجاد نمود. • برای رسم یک درخت دودویی کامل یا پر با داشتن تنها یک پیمایش نیز می توان درخت دودویی را رسم نمود.

  32. جلسه هفتم درخت ها • نمایش عبارات محاسباتی با درخت دودویی • عبارات محاسباتی با عملگرهای دوتایی را می توان با درخت های دودویی محض نمایش داد. برای این کار باید عملوند ها را در برگها و عملگرها را در گره های غیر برگ قرار دهیم. درخت دودویی محض درختی است که در آن تمام گره ها از درجه صفر یا دو باشند. درخت دودویی محض درخت دودویی غیر محض

  33. جلسه هفتم درخت ها • مثال : نمایش عبارات محاسباتی با درخت دودویی • پیمایش میانوندی (infix) مستلزم استفاده از پرانتزها جهت تعویض تقدم عادی عملگرهاست نمی توان با پیمایش میانوندی (inorder) ساده بدست آورد. A + B * C ( A+ B * C) ^ (( A+B) * C)

  34. جلسه هفتم درخت ها • نمایش عبارات محاسباتی با درخت دودویی • نکته چنانچه عبارت محاسباتی عملگر یکانی داشته باشد (مثال : -B ) باید عملوند آن را فرزند راست عملگر یکانی قرار دهیم. Preorder: *A-B Postorder: AB-* Inorder: A*(-B) * - A B

  35. جلسه هفتم درخت ها • تمرین • فرض کنید پیمایش یک درخت دودویی کامل بصورت FBDACHGMN می باشد، درخت دودویی آن را رسم کنید. • دو پیمایش زیر موجود است ، 1- درخت دودویی این پیمایش را بسازید 2- تعداد درختهایی که می توان از روی این دو پیمایش ساخت دقیقا چند عدد می باشد؟ • Preorder = ABDFGHIJCE Postorder = FIJHGDBECA

  36. Any Question ????

More Related