570 likes | 1.37k Views
جلسه هشتم. به نام خداوند هستی بخش یگانه. درخت بخش 2. TREE. A.M. Safaei. جلسه هشتم. درخت ها. درخت عمومی ( General Tree ) درخت عمومی یک درخت K تایی است که هر گره آن می تواند حداکثر K فرزند داشته باشد. تفاوت درخت دودویی و درخت عمومی درخت دودویی هر گره حداکثر دو فرزند دارد.
E N D
جلسه هشتم به نام خداوند هستی بخش یگانه درختبخش 2 TREE A.M. Safaei
جلسه هشتم درخت ها • درخت عمومی (General Tree) • درخت عمومی یک درخت K تایی است که هر گره آن می تواند حداکثر K فرزند داشته باشد. • تفاوت درخت دودویی و درخت عمومی • درخت دودویی هر گره حداکثر دو فرزند دارد. • یک درخت دودویی میتواند تهی باشد ولی یک درخت عمومی نمی تواند خالی باشد. • فرض کنید یک درخت تنها یک فرزند داشته باشد، آنگاه این فرزند در یک درخت دودویی با عنوان فرزند راست یا چپ از هم متمایز می شود در حالی که در درخت عمومی هیچگونه تمایزی بین آنها نیست. • دو درخت الف و ب از لحاظ درخت دودویی با هم متمایز می باشند ولی از لحاظ درخت عمومی با هم هیچگونه تفاوتی ندارند.
جلسه هشتم درخت ها • تبدیل درخت عمومی به درخت دودویی • ابتدا در هر سطح کلیه گره های همزاد را به یکدیگر وصل می کنیم، • سپس ارتباط کلیه گره های همزاد به پدرشان را به جز اتصال سمت چپ ترین فرزند قطع می کنیم. • گره های متصل به هم در سطح افقی را 45 درجه در جهت عقربه های ساعت می چرخانیم.
جلسه هشتم درخت ها • مثال : تبدیل درخت عمومی به درخت دودویی
جلسه هشتم درخت ها • درختان نخی دودویی ( درختان پیچ دار) • تعداد اتصالات تهی در یک درخت دودویی بیشتر از تعداد اشاره گرهای غیرتهی است. • در یک درخت دودویی تعداد n + 1 اتصال از کل اتصالات آن یعنی ، 2n تهی است. یک راه برای به کارگیری این که از اتصالات تهی برای ارتباط با دیگر گره های یک درخت استفاده شود که در این صورت درخت را درخت نخی می نامند. • در یک درخت دودویی با تعداد n گره، 2n اشاره گر وجود دارد که از این تعداد n-1 اشاره گر استفاده شده است و همواره n+1 اشاره گر مقدار Null دارند. با استفاده از این اشاره گرهای بدون استفاده می توان از آنها برای اشاره کردن به عناصر قبلی یا بعدی در یک پیمایش استفاده کرد. در نتیجه در هنگام پیمایش به نحو سریعتریی می توان درخت را پیمایش کرد. درختی که اشاره گر های بلااستفاده آن بدین صورت مورد استفاده قرارمی گیرد درخت نخ کشی شده می گویند.
جلسه هشتم درخت ها • درختان نخی دودویی ( درختان پیچ دار) • در درخت های نخی باید اشاره گرهای واقعی از اشاره گرهای نخی متمایز باشند، لذا به هر گره دو فیلد منطقی Ltag و Rtag اضافه می شود اگر Ltag یا Rtag دارای مقدارTrue باشند آنگاه اشاره گر نخی می باشد و در غیر اینصورت اشاره گر عادی می باشد. • اگر اشاره گر Left در صورتی که بلااستفاده باشد، جهت اشاره به عنصری استفاده می شود که در پیمایش میانودی آن قبل از این عنصر قرار دارد و اشاره گر right برای اشاره به عنصر بعدی استفاده می شود.
جلسه هشتم درخت ها • درختان نخی دودویی ( درختان پیچ دار) • برای ایجاد اتصالات نخی از قوانین زیر استفاده می شود : • اگر ptr left_child تهی باشد ، آن را طوری تغییر می دهیم که به گره ای که در پیمایش inorder قبل از ptr قرار دارد ، اشاره کند. • اگر ptr right_child تهی باشد ، آن را طوری تغییر می دهیم که به گره ای که در پیمایش inorder بعد از ptr قرار دارد ، اشاره کند.
جلسه هشتم درخت ها • درختان نخی دودویی ( درختان پیچ دار) • نمونه ای از درخت نخی دودویی G اتصالات نخي
جلسه هشتم درخت ها • درختان نخی دودویی ( درختان پیچ دار) • در شکل زیر اشاره گر سمت راست G و اشاره گر سمت چپ H به هیچ جایی اشاره نمی کنند در حالی که هدف از ارائه درخت های نخی این بود که هیچ اشاره گر تهی نداشته باشند، برای این منظوری گره ای بنام Head در نظر می گیریم که اشاره گر root به آن اشاره می کند و Ltag گره head به شروع گره اول درخت واقعی اشاره می کند.
جلسه هشتم درخت ها • درختان نخی دودویی ( درختان پیچ دار) Head
جلسه هشتم درخت ها • جنگل • یک جنگل مجموعه ای مرتب از صفر یا چند درخت متمایز است. • جنگل مجموعه ای از N>=0 درخت مجزا است. • اگر ریشه یک درخت را حذف کنیم جنگل بوجود می آید. جنگل
جلسه هشتم درخت ها • تبدیل جنگل به درخت دودویی • ابتدا هر درخت را به درخت دودویی تبدیل می کنیم ( با استفاده از روش فرزند چپ – برادر راست ) • سپس از چپ به راست ریشه هر درخت سمت راست را از فرزند راست درخت سمت چپش در نظر می گیرم. مثال : جنگل زیر را به درخت دودویی تبدیل کنید. جنگل
جلسه هشتم درخت ها • تبدیل جنگل به درخت دودویی • ابتدا هر درخت را به درخت دودویی تبدیل می کنیم ( با استفاده از روش فرزند چپ – برادر راست )
A E B C F G H D I جلسه هشتم درخت ها • تبدیل جنگل به درخت دودویی • سپس از چپ به راست ریشه هر درخت را بعنوان فرزند راست درخت سمت چپی در نظر می گیریم.
جلسه هشتم درخت ها • درختان با ساختار مشخص • درخت HEAP (هرم) :: نوع داده مجرد هرم (ADT) • درخت max tree درختی است که مقدار کلید هر گره آن بزرگتر یا مساوی فرزندانش باشد. • درخت min treeدرختی است که مقدار کلید هر گره آن کوچکتر یا مساوی فرزندانش باشد. • درخت max heapیک درخت دودویی کامل است که یک max tree نیز می باشد. • درخت min heapیک درخت دودویی کامل است که min tree نیز می باشد.
2 14 4 7 7 12 10 6 8 6 10 8 9 10 3 83 6 20 50 5 جلسه هشتم درخت ها • مثال از max heap • مثال از min heap
جلسه هشتم درخت ها • درج یک عنصر در درخت HEAP • اعمال اضافه کردن یک عنصر در درخت و حذف عنصری از آن باید طوری صورت پذیرد که درخت بصورت هرم (Heap) یعنی درخت دودوئی کامل و خاصیت heap را داراست باقی بماند. • با فرض اینکه یک درخت heap هم کامل است و هم maxtree، ابتدا هر گره را از چپ به راست در هر سطح در درخت درج می کنیم تا درخت کامل شود ، سپس برای برقراری شرط maxtree بودن درخت گره درج شده را تا جایی که از اجدادش بزرگتر باشد با آنها جابجا می کنیم. • مراحل ایجاد : • ابتدا یک گره خالی ایجاد کرده • سپس heap بودن درخت را بررسی می کنیم، چون درخت دودوئی کامل است بنابراین از چپ به راست آن را ساخته و پر می کنیم .
جلسه هشتم درخت ها • مثال : درج عدد 27 به درخت Heap از نوع maxtree
جلسه هشتم درخت ها • مثال : درخت maxheap حاصل از ورودی های روبه رو را رسم کنید. 44, 30, 50, 22, 60, 55, 77
جلسه هشتم درخت ها • مثال : درخت maxheap حاصل از ورودی های روبه رو را رسم کنید. 44, 30, 50, 22, 60, 55, 77
جلسه هشتم درخت ها • مثال : درخت maxheap حاصل از ورودی های روبه رو را رسم کنید. 44, 30, 50, 22, 60, 55, 77 2 جابجائی 55 44 77
جلسه هشتم درخت ها • حذف عنصری از درخت HEAP • برای حذف همواره مقدار ریشه حذف می شود و سپس در پائین ترین سطح، سمت راست ترین برگ را بجای ریشه قرار می دهیم و سپس درخت را تنظیم می کنیم. برای این کار ریشه جدید را تا جایی که از فرزندان خود کوچک تر باشد یا بزرگ ترین آنها جابجا می کنیم .
جلسه هشتم درخت ها • کاربرد های درخت HEAP • کاربرد درخت Heap در صف اولویت • در صف اولویت می توان عنصری را با اولویت اختیاری به صف اولویت اضافه نمود ولی در موقع حذف عنصر دارای بالاترین اولویت حذف می شود. برای پیاده سازی صف اولویت می توان از آرایه، لیست پیوندی و درخت Heap استفاده نمود ولی نمایش صف اولویت بصورت هرم این امکان را فراهم می سازد که هم عمل حذف و هم عمل درج در بهترین زمان انجام می شود که همین امر ارجحیت درخت Heap نسبت به آرایه، لیست پیوندی نشان می دهد.
جلسه هشتم درخت ها • کاربرد های درخت HEAP • کاربرد درخت Heap در مرتب سازی • برای مرتب کردن آرایه ای با n عضو ابتدا یک درخت heap از عناصر آرایه می سازیم. سپس ریشه آن را به طور مکرر حذف می کنیم. برای مرتب کردن صعودی داده ها از Min heap و جهت مرتب سازی نزولی داده ها از max heap استفاده می شود. • با توجه به اینکه عمل درج و حذف با زمان انجام می شود با استفاده از یک حلقه n مرتبه ای الگوریتم مرتب سازی به وسیله درخت heap با زمان انجام می شود.
30 40 5 2 جلسه هشتم درخت ها • درختان جستجوی دودویی (Binary Search Tree - BST) • یک درخت جستجوی دودویی درختی است که دارای خصوصیات زیر باشد : • هر عنصر دارای یک کلید است و دو عنصر نباید دارای کلید یکسان باشند ، در واقع کلیدها منحصر به فرداند. • کلیدهای واقع در زیردرخت غیرتهی چپ باید کمتر از مقدار کلید واقع در ریشه زیردرخت راست باشد. • کلیدهای واقع در زیردرخت غیرتهی راست باید بزرگتر از مقدار کلید واقع در ریشه زیردرخت چپ باشد. • زیردرختان چپ و راست نیز خود درختان جستجوی دودویی میباشند. • پیمایش میانوندیLVR این درخت مقادیر موجود در گره ها را بصورت مرتب شده صعودی و پیمایش میانوندی RVL آن را بصورت مرتب شده نزولی به خروجی می فرستند.
جلسه هشتم درخت ها • جستجوی یک عنصر در درخت جستجوی دودویی (BST) • فرض کنید خواسته باشیم دنبال عنصری با کلید key بگردیم. ابتدا از ریشه (root) شروع می کنیم ،اگر ریشه تهی باشد ، درخت جستجو فاقد هر عنصری بوده و جستجو ناموفق خواهد بود. در غیر این صورت keyرا با با مقدار کلید ریشه مقایسه کرده : • اگر key کمتر از مقدار کلید ریشه باشد ، هیچ عنصری در زیردرخت راست وجود ندارد که دارای کلیدی برابر key باشد ، بنابراین زیردرخت چپ ریشه را جستجو می کنیم. • اگر key بزرگتر از مقدار کلید ریشه باشد ، زیردرخت راست را جستجو می کنیم.
جلسه هشتم درخت ها • BSTNode* BST::Search(int key) • { • BSTNode *p=root; • while(p!=NULL) • { • if(key < p→key) • p = p→left; • else if(key > p→key) • p = p→right; • else • return p; • } • return 0; • } • الگوریتم غیر بازگشتی جستجوی یک عنصر در درخت جستجوی دودویی (BST)
جلسه هشتم درخت ها BSTNode* BST::Search(int key) { return Search(root , key); } BSTNode* BST::Search(BSTNode* p, int key) { if (!p) return 0; if(key ==p→key) return p; if(key <p→key) return Search(p→left , key); else return Search(p→right , key); } • الگوریتم بازگشتی جستجوی یک عنصر در درخت جستجوی دودویی (BST)
جلسه هشتم درخت ها • با توجه به دو الگوریتم جستجو یک عنصر در درخت BST که حداکثر تا عمق درخت (h) ادامه می یابد لذا زمان لازم برای جستجو برابر است با O(h) • مرتبه اجرائی جستجوی یک عنصر در درخت BSt با n گره در بهترین حالت برابراست با و در بدترین حالت برابر است با O(n). • مثال : حداکثر تعداد مقایسه برای یافتن کلیدی در یک درختBST با n گره برابر با چه مقداری است ؟ • تحلیل الگوریتم های جستجوی یک عنصر در درخت جستجوی دودویی (BST) • به اندازه عمق درخت
جلسه هشتم درخت ها • برای درج عنصر جدیدی به نام key ، ابتدا باید مشخص نمود که آیا کلید با عناصر موجود متفاوت است یا خیر. برای انجام این کار باید درخت را جستجو کرد O(h) ، اگرجستجو ناموفق باشد ، عنصر را در محلی که جستجو خاتمه پیدا نموده است ، درج می کنیم O(1) . • مرتبه اجرائی الگوریتم های جستجو و درج در BST هر دو با زمان O(h) انجام می شود. • درج عنصر در درخت جستجوی دودویی (BST)
81 36 30 40 5 81 2 30 30 40 40 5 5 2 2 جلسه هشتم درخت ها • درج عنصر در درخت جستجوی دودویی (BST) درج 81 درج 36
جلسه هشتم درخت ها void insert (node * tree, int key) { node *ptr; ptr = get node ( ); ptr info = key; ptr left = Null; ptr right = Null; if ( tree info > key) tree left = ptr; else if ( tree info < key) tree right = ptr; } • الگوریتم تابع درج عنصر در درخت جستجوی دودویی (BST)
84 47 40 58 16 10 جلسه هشتم درخت ها • در درخت زیر فرض کنید عدد 37 را جایگزین عدد 25 شود آنگاه درخت مزبور همچنان یک BST باقی خواهد ماند ولی اگر عدد 42 را جایگزین 25 کنیم دیگر BST نخواهد بود. حال فرض کنید عدد 22 را درخت درج کنیم چه عملیاتی لازم خواهد بود. • مثال 2 : درج عنصر در درخت جستجوی دودویی (BST) 25 20 72
84 47 40 58 16 10 جلسه هشتم درخت ها • Key = 22 را با ریشه یعنی 40 مقایسه می کنیم چون از آن کوچکتر است به طرف فرزند چپ 40 یعنی 16 می رویم. • Key = 22را با 16 مقایسه می کنیم چون از آن بزرگتر است به طرف فرزند راست 16 می رویم. • Key =22 را با 25 مقایسه می کنیم چون از آن کوچکتر است به طرف فرزند چپ 25 یعنی 20 می رویم. • Key =22 را با 20 مقایسه می کنیم چون از آن بزرگتر است به طرف فرزند راست 20 می رویم و چون 20 فرزند راست ندارد 22 را به درخت درج می کنیم. • مثال 2 : درج عنصر 22 در درخت جستجوی دودویی (BST) 25 20 72 22
جلسه هشتم درخت ها • برای حذف یک گره پس از جستجوی آن گره سه حالت ممکن رخ می دهد: • اگر گره مورد نظر برگ باشد به راحتی حذف شده و نیازی به تنظیم درخت نیست. • اگر گره مورد نظر تنها دااری یک فرزند باشد، فرزند جانشین گره پدر می شود. • اگر گره مورد نظر دارای دو فرزند باشد پیمایش میانوندی LVR درخت را می نویسیم گره ای که در پیمایش میانوندی بعد از گره مورد نظر قرار می گیرد بعنوان جانشین انتخاب می شود. • حذف عنصری از یک در درخت جستجوی دودویی (BST) حذف گره 49 از BST
جلسه هشتم درخت ها • حذف عنصری از یک در درخت جستجوی دودویی (BST) حذف گره 80از BST • چون گره 30 دارای 2 فرزند است بنابراین طبق پیمایش میانودی می بایست گره ای که بعد از گره 30 قرار دارد بعنوان گره پدر قرار داده شود. • 20, 30, 38, 55, 56, 71 حذف گره 30از BST • عمل حذف در زمان O(h) انجام می گیرد ( h عمق درخت)
A D B C K F جلسه هشتم درخت ها تمرین 1- نمایش دودویی درخت عمومی زیر را بدست آورید. E H J G M N L
جلسه هشتم درخت ها 2- درخت BST حاصل از ورودی های زیر را رسم کنید 40, 60, 50, 33, 55, 11 3- اگر عنصر 40 از درخت BST بصورت زیر حذف شود درخت حاصل را ترسیم نمایید. (40(20(10,30),60(50(45,55(52),70)))) 4- درخت جستجوی دودویی حاصل از درج کارکترهای زیر را رسم کنید. C,O,R,N,F,L,A,K,E,S 5- درخت Heap حاصل از درج اعداد زیر را مرحله به مرحله رسم کنید. 9,6,5,3,2,1
Any Question ????