1 / 100

فصل پنجم : درخت

فصل پنجم : درخت. آشنايي با درخت درخت هاي دودويي پيمايش درختان هرم جنگل. اهداف. فصل پنجم : درختان. درخت. ساختار درختي يعني مجموعه داده هاي سازماندهي شده اي که عناصر اطلاعاتي شان به وسيله انشعاباتي با هم رابطه داشته باشند. مفهوم درخت.

donna-russo
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. فصل پنجم : درخت • آشنايي با درخت • درخت هاي دودويي • پيمايش درختان • هرم • جنگل اهداف

  2. فصل پنجم : درختان درخت ساختار درختي يعني مجموعه داده هاي سازماندهي شده اي که عناصر اطلاعاتي شان به وسيله انشعاباتي با هم رابطه داشته باشند.

  3. مفهوم درخت • درخت مجموعه محدودي از يک يا چند گره به صورت زير مي باشد : • داراي گره خاصي به نام ريشه باشد. • بقیه عناصر درخت به ریشه متصل هستند. • بقيه گره ها به n ≥ 0 مجموعه مجزا تقسيم شده که هر يک از اين مجموعه ها خود يک درخت هستند. زير درختان ريشه ناميده مي شوند.

  4. تعريف • به عنصر حاوي اطلاعات و انشعابات به ديگر عناصر، گره اطلاق مي شود. • تعداد زير درختهاي يك گره، درجه آن ناميده ميشود • گره اي كه درجه آن صفر باشد، برگ يا گره پاياني ناميده ميشود و در مقابل بقيه گره‌ها گره هاي غيرپاياني ناميده ميشوند. • گره ريشه را در هر زير درخت گره پدر(والد) و به گره‌هاي متصل شده به آن گره فرزند ميگويند • فرزنداني كه پدر يكسان دارند برادر (يا همزاد) ناميده ميشوند

  5. ريشه درخت A B C D همزاد J E F G H I M K L مثالي از يک درخت درجه A = 3 شکل1-5 A والد B ، C، D است . B ، C، D همزادند.

  6. اصطلاحات درخت ها اجداد گره : اجداد يک گره ، گره هايي هستند که در مسير طي شده از ريشه تا آن گره وجود دارند. سطح گره : سطح يک گره بدين صورت تعريف مي شود که ريشه در سطح يک قرار مي گيرد. براي تمامي گره هاي بعدي ، سطح گره برابر است با سطح والد به اضافه يک . ارتفاع درخت : ارتفاع يا عمق يک درخت به بيشترين سطح گره هاي آن درخت گفته مي شود.

  7. A B C D J E F G H I M K L نمايش ليست يک راه نمايش درخت ، استفاده از ليست است . شکل 1-5 را مي توان به صورت زير نشان داد : (A(B(E(K ،L)،F)،C(G)،D(H(M)،I،J)))

  8. اگر بخواهيم براي نگهداري يك درخت ساختمان داده اي مانند نمايش معمول (هر گره آدرس گره هاي فرزند خود را داشته باشد) تعريف كنيم مشكل زير بوجود مي‌آيد: • درجه تمام درختها يكي نميباشد لذا مجبور خواهيم شد براي هر گره تعداد متغيري از اشاره گرها داشته باشيم. با اين وجود، نوشتن الگوريتم براي گره‌هايي كه طول متغير دارند دشوار خواهد شد • براي حل مشكل بايد از گره هايي با طول ثابت استفاده كنيم.

  9. اگر بيشترين درجه درخت k باشد بنابراين هر گره بايد توانايي نگهداري k اشاره گر را داشته باشد و ساختمان داده اي به شكل زير بايد تعريف كنيم. استفاده از گره با طول ثابت

  10. قضيه • اگر T درختي از درجه k با n گره باشد و هر گره آن مانند شكل قبل طول ثابتي داشته باشد آنگاه n(k-1)+1 از nk فيلد بچه آن (اشاره گرهاي به فرزند) برابر 0‌ (NULL) است. • اثبات: • از آنجا كه هر فيلد بچه غير صفر به يك گره اشاره ميكند و براي هر گره غير از ريشه يك اشاره گر وجود دارد از اينرو تعداد فيلدهاي بچه غيرصفر براي درختي با n گره دقيقاً برابر n-1 است. تعداد كل فيلدهاي بچه براي درختي با n گره از درجه k برابر nk ميباشد. لذا: • تعداد اشاره گرهاي بچه NULL : nk-(n-1)=n(k-1)+1

  11. براي درختان دو نمايش خاص كه از گره‌هايي با طول ثابت استفاده ميكند ارائه ميكنيم. • الف) نمايش درخت بصورت بچه چپ-همزاد راست • ب) نمايش درخت بصورت يك درخت درجه 2.

  12. نمايش دودويي يک درخت • براي نمايش درختان دودويي ، دقيقا نياز به دو اتصال يا اشاره گر به ازاي هر گره است.

  13. A 0 D C B A 0 B C D E F G H I J 0 0 0 0 0 0 0 J E F G H I K L M 0 0 0 M 0 0 K L بصورت بچه چپ-همزاد راست

  14. A 0 D C B A 0 B C D E F G H I J 0 0 0 0 0 0 0 J E F G H I K L M 0 0 0 M 0 0 K L بصورت درخت درجه 2

  15. 2-5 درخت هاي دودويي تعريف : يک درخت دودويي يا تهي است يا حاوي مجموعه اي محدود از گره ها شامل يک ريشه و دو زير درخت دودويي است. اين درخت ها زير درخت هاي چپ و راست ناميده مي شوند. • مشخصه اصلي يک درخت دودويي بدين شکل است که هر گره آن حداکثر دو انشعاب دارد يعني گره هايي که درجه اي بيشتر از دو نداشته باشند. • براي درخت هاي دودويي زير درخت سمت چپ و راست با يکديگر متمايز است.

  16. 2-5 ساختار درخت دودويي structureBinary_tree (abbreviated BinTree) is objects : a finite set of nodes either empty or consisting of a root node ، left Binary_tree ، and right Binary_tree. functions : for all bt ، bt1 ، bt2 BinTree ، item element BinTreeCreate() BooleanIsEmpty(bt) BinTreeMakeBT(bt1 ، item ، bt 2) BinTreeLchild(bt) elementData(bt) BinTreeRchild(bt)

  17. 2-5 تفاوت درخت عادي با درخت دودويي • در هيچ درخت عادي صفر گره وجود ندارد ، اما درخت دودويي تهي وجود دارد. • در يک درخت دودويي ترتيب فرزندان داراي اهميت بوده در حالي که در درخت عادي به اين صورت نيست.

  18. 2-5 خواص درختان دودويي حداکثر تعداد گره ها • حداکثر تعداد گره ها در سطح i ام يک درخت دودويي 2i-1 است. • حداکثر تعداد گره ها در يک درخت دودويي به عمق k ، 2k-1 است.

  19. براي هر درخت دودويي غير تهي مانند T ، اگر تعدادگره هاي پاياني و تعداد گره هاي درجه 2 باشد ، آنگاه خواهيم داشت : 2-5 خواص درختان دودويي رابطه بين تعداد گره هاي برگ و گره هاي درجه 2

  20. 2-5 خواص درختان دودويي • يک درخت دودويي پر به عمق k ، يک درخت دودويي پر است مشروط به اينكه 2k-1 گره داشته باشد. • يک درخت دودويي با n گره و عمق kکامل است ، اگر و تنها اگر گره هايش مطابق با گره هاي شماره گذاري شده در يک درخت دودويي پر به عمق k باشد. • ارتفاع يك درخت دودويي كامل با n گره برابر است

  21. 2-5 نمايش درخت دودويي نمايش آرايه نمايش ليست پيوندي نمايش درخت دودويي به دو صورت است :

  22. 2-5 نمايش آرايه • شيوه شماره گذاري ارايه شده در شکل زير ، اولين نمايش يک درخت دودويي در حافظه را مطرح و پيشنهاد مي کند . از آنجايي که گره ها از 1 تا n شماره گذاري شده اند ، يک آرايه يک بعدي مي تواند براي ذخيره سازي گره ها استفاده شود.

  23. A B C G D E F I H 2-5 نمايش آرايه نمايش آرايه اي درخت دودويي

  24. 2-5 نمايش آرايه اگر يک درخت دودويي کامل با n گره ( يعني عمق ) به ترتيب بالا تعريف شده باشد ، آنگاه براي هر گره با انديسi و ≤ ni1≤ ، داريم: • (1) اگر i≠1 ، آنگاه پدر i در [i/2] است . اگر i=1 ، i ريشه است و پدري نخواهد داشت. • (2) اگر2i≤n ، آنگاه فرزند چپ i در 2i است. اگر 2i>n ، آنگاه i فرزند چپ ندارد. • (3) اگر 2i+1≤n ، آنگاه فرزند راست i در 2i+1 است. اگر 2i+1>n ، آنگاه i فرزند راست ندارد

  25. 2-5 نمايش آرايه در بدترين حالت ، يک درخت مورب به عمق k ، به محل و موقعيت نياز دارد که از اين مقدار، فقط k محل اشغال مي شود.

  26. 2- 5 نمايش ليست پيوندي اگرچه نمايش ترتيبي (آرايه اي) براي درختان دودويي کامل مناسب به نظر مي رسد ، ما براي بسياري از درختان ديگر باعث اتلاف حافظه ميشود به علاوه ، اين روش از نارسايي هاي موجود در نمايش ترتيبي نيز برخوردار است. درج يا حذف گره هاي يک درخت ، مستلزم جابه جايي گره هاست که خود باعث تغيير شماره سطح گره ها مي شود. اين مسايل مي تواند با به کارگيري نمايش پيوندي به آساني حل شود.

  27. 2-5 نمايش ليست پيوندي با اين روش هر گره سه فيلد خواهد داشت : left_child ، data ، right_child که در زبان C به شرح زير تعريف مي شوند : typedef struct node *tree_pointer ; typedef struct node { int data ; tree_pointer left_child ، right_child ; };

  28. class Tree; class TreeNode { friend class Tree; private: char data; TreeNode *LeftChild; TreeNode *RightChild; }; class Tree { public: Tree(); Tree(const Tree& t); private: TreeNode *root; }; اعضاي كلاس Expression

  29. data left_child right_child 2-5 نمايش ليست پيوندي نمايش يک گره درخت دودويي

  30. 3-5 پيمايش درخت دودويي به هنگام پيمايش يک درخت دودويي ، با هر گره و زيردرختانش به طرز مشابهي رفتار کنيم. اگر R ، V ، Lبه ترتيب حرکت به چپ ، ملاقات کردن يک گره ( براي مثال ، چاپ فيلد داده آن گره) و حرکت به راست باشد، آنگاه شش ترکيب ممکن براي پيمايش يک درخت خواهيم داشت : RLV ، RVL ، VRL ، VLR ، LRV ، LVR

  31. 3-5 پيمايش درخت دودويي مثال اگر تنها حالتي را انتخاب کنيم که ابتدا به سمت چپ و بعد به سمت راست برود ، تنها سه ترکيب VLR ، LRV ، LVR خواهيم داشت. اين سه حالت را با توجه به موقعيت V نسبت به L و R به ترتيب preordcr ، postorder ، inorder مي ناميم.

  32. 3-5 پيمايش درخت دودويي • در پيمايش postorder ، يک گره موقعي ملاقات و چاپ مي شود که زيردرختان چپ و راست آن قبلا ملاقات شده باشند. • در پيمايش preorder ، يک گره قبل از پيمايش زيردرختان چپ و راست ، ملاقات مي گردد.

  33. 1 + E * 2 17 18 19 * D 3 14 15 16 C / 4 11 12 13 A B 5 8 9 10 6 7 3-5 پيمايش درخت دودويي درخت زير حاوي يک عبارت رياضي است : A/B*C*D*+E درخت دودويي براي يک عبارت محاسباتي

  34. 3-5 پيمايش Inorder هنگامي که اين پيمايش انتخاب مي شود ، حرکت به سمت پايين به طرف چپ انجام مي شود و اين عمل تا آخرين گره صورت مي گيرد سپس مي توان گره را بازيابي کرد و بعد به سمت راست رفته و به همين ترتيب کار ادامه پيدا مي کند. اين متناظر با شکل infix يک عبارت است.

  35. 3-5 پيمايش Inorderيک درخت دودويي void inorder (tree_pointer ptr ) /* inorder tree traversal */ { if (ptr) { inorder ( ptr -> left_child ); printf (“ % d” ، ptr -> data ); inorder (ptr -> right_child); } }

  36. 3-5 پيمايش Preorder تابع preorder حاوي دستورات لازم براي شکل دوم پيمايش است. بر اساس اين پيمايش ، گره را ابتدا بازيابي و ملاقات نموده و سپس انشعابات چپ را دنبال و تمام گره ها را بازيابي مي کنيم. اين فرآيند ادامه پيدا مي کند تا به يک گره تهي برسيم. در اين نقطه ، به نزديکترين جدي که داراي يک فرزند راست باشد مراجعه و با اين گره شروع خواهيم نمود.

  37. 1 + E * 2 17 18 19 * D 3 14 15 16 C / 4 11 12 13 A B 5 8 9 10 6 7 3-5 پيمايش Preorder با پيمايش preorder گره هاي درخت زير خروجي به شکل زير خواهند داشت : خروجي + * * / A B C D E اين به شکل يک عبارت prefix است.

  38. 3-5 پيمايش Preorder يک درخت دودويي Vide preorder (tree_pointer ptr ) /* preorder tree traversal */ { if (ptr) { printf (“ % d” ، ptr -> data ); preorder ( ptr -> left_child ); preorder (ptr -> right_child); } }

  39. 3-5 پيمايش postorder اين پيمايش دو فرزند يک گره را قبل از بازيابي آن گره ملاقات و چاپ مي کند. اين مساله بدين مفهوم است که فرزندان يک گره قبل از خود آن گره بازيابي مي گردد.

  40. 1 + E * 2 17 18 19 * D 3 14 15 16 C / 4 11 12 13 A B 5 8 9 10 6 7 3-5 پيمايش postorder خروجي حاصل از پيمايش postorder شکل زير به صورت زير است : خروجي A B/ C* D* E + اين خروجي مانند يک عبارت postfix است.

  41. 3-5 پيمايش inorder غيربازگشتي Void iter_pointer (tree_pointer node ) { int top = -1 ; /* initialize stack */ tree_pointer stack [MAX_STACK_SIZE] ; for ( ; ; ) { for (; node ; node = ->left_child) add ( &top ، node ); /* add to stack */ node = delete (&top); /*delete from stack */ if (! Node) break ; /* empty stack*/ printf (“ % d”، node-> data ) ; node = node -> right_child; } }

  42. 3-5 پيمايش inorder غيربازگشتي تحليل inorder2 : فرض کنيد تعداد گره هاي درخت n باشد ، اگر عمل iter_inorder را در نظر بگيريم ، مشاهده مي شود که هر گره درخت فقط يک بار در پشته قرار گرفته و يا از آن خارج مي شود. بنابراين اگر تعداد گره هاي درخت n باشد ، پيچيدگي زمان تابع برابر با O(n) مي باشد. حافظه مورد نياز برابر با عمق درخت است که مساوي با O(n) مي باشد.

  43. 3-5 پيمايش ترتيب سطحي پيمايش هاي inorder ، preorder ، postorder چه به صورت بازگشت پذيري نوشته يا به صورت غيربازگشتي ، همگي نيازمند پشته مي باشند. اين پيمايش ، ترتيب سطحي ، ابتدا ريشه را بازيابي ، سپس فرزند چپ ريشه و به دنبال آن فرزند راست ريشه بازيابي مي گردد. اين شيوه با بازيابي از گره منتهي اليه سمت چپ به سمت راست هر سطح جديد تکرار مي گردد. اين پيمايش از صف استفاده مي کند.

  44. 1 + E * 2 17 18 19 * D 3 14 15 16 C / 4 11 12 13 A B 5 8 9 10 6 7 3-5 پيمايش ترتيب سطحي پيمايش ترتيب سطحي درخت زير به صورت زير است : + *E *D / C A B

  45. 4-5 اعمال مفيد بر روي درختان دودويي 1- کپي کردن درختان دودويي 2- تعيين برابري و تساوي دو درخت 3- مساله Satisfiability

  46. 5-5 درختان نخي دودويي تعداد اتصالات تهي در يک درخت دودويي بيشتر از تعداد اشاره گرهاي غيرتهي است. در يک درخت دودويي تعداد n + 1 اتصال از کل اتصالات آن يعني ، 2n تهي است. يک راه براي به کارگيري اين اتصالات توسط پرلين و تورنتن پيشنهاد شد. راه حل اين بود که از اتصالات تهي براي ارتباط با ديگر گره هاي يک درخت استفاده شود که در اين صورت درخت را درخت نخي مي نامند.

  47. 5-5 درختان نخي دودويي • براي ايجاد اتصالات نخي از قوانين زير استفاده مي شود : • اگر ptr-> left_child تهي باشد ، آن را طوري تغيير مي دهيم که به گره اي که در پيمايش inorder قبل از ptr قرار دارد ، اشاره کند. • اگر ptr-> right_child تهي باشد ، آن را طوري تغيير مي دهيم که به گره اي که در پيمايش inorder بعد از ptr قرار دارد ، اشاره کند.

  48. 5-5 درختان نخي دودويي هنگامي که درختي را در حافظه نمايش مي دهيم ، بايستي بتوانيم بين اتصالات نخي و واقعي تفاوتي قايل شويم. اين کار را با افزودن دو فيلد اضافي به هر گره انجام مي دهيم که آنها را right_thread ، left_thread مي ناميم.

  49. A B C G D E F I H A B C G D E F I H 5-5 درختان نخي دودويي درخت نخي متناظر اتصالات نخي

  50. 5-5 پيمايش inorder يک درخت نخي دودويي براي هر گره مانند ptr ، در يک درخت دودويي ، چنانچه ptr->right_thread = TRUE باشد ، طبق تعريف گره بعدي ptr در پيمايش inorder ، ptr->right_child مي باشد . در غير اين صورت گره بعدي ptr، با پايين رفتن روي مسير فرزندان چپ ptr از طرف فرزند سمت راست ptr تا وقتي که به گره اي با وضعيت left_thread = TRUE برسيم ، تعيين مي شود .

More Related