You are on page 1of 15

‫پيمايش درخت ها‬

‫سرفصل‬
‫• تعريف‬
‫پيمايش اول سطح ‪Breadth-first‬‬ ‫•‬
‫پيمايش اول عمق ‪Depth-first‬‬ ‫•‬
‫پيمايص ‪In-Order‬‬ ‫•‬
‫پيمايص ‪Post-Order‬‬ ‫•‬
‫پيمايص ‪Pre-Order‬‬ ‫•‬
‫بازيابی درخت دودويی‬ ‫•‬

‫‪2‬‬
‫تعريف‬
‫• مفًُم پيمايص درخت بٍ ريش دستيابی ػىاصر درين آرايٍ ي يا ليىک ليست بٍ يک‬
‫ترتيب مطخص اطالق می گردد‪.‬‬

‫• ريش َای پيمايص درخت َای سادٌ‬


‫‪-‬پيمايص ايل سطح ‪Breadth-first‬‬
‫پيمايص ايل ػمك ‪Depth-first‬‬

‫• ريش َای پيمايص درخت ديدييی‬


‫‪ -‬ميان يوذی ‪In-Order‬‬
‫‪ -‬پيطًوذی ‪Post-Order‬‬
‫‪ -‬پسًوذی ‪Pre-Order‬‬

‫‪3‬‬
‫پيمايش اول سطح ‪Breadth-first‬‬
‫در پيمايص ايل سطح )‪ Breadth-first Search (BFS‬ابتذا َمٍ وًدَای ػمك ‪ k‬ام‬ ‫•‬
‫درخت از چپ بٍ راست پيمايص ضذٌ ي سپس بٍ سراؽ ػمك ‪ k+1‬ام ميرييم‪.‬‬

‫مطخصات‬ ‫•‬
‫– برای پيمايص ايل سطح از ابسار صف استفادٌ می ضًد‪.‬‬
‫– زمان اجرای آن )‪ ϴ(n‬کٍ ‪ n‬برابر تؼذاد وًدَاست‬
‫– ميسان حافظٍ الزم برابر )‪ϴ(m‬‬
‫کٍ ‪ m‬برابر ماکسيمم ػىاصر در يک ػمك است‪.‬‬

‫مثال‪ :‬در درخت ريبري‬ ‫•‬


‫پيمايص ‪ BFS‬برابر (از چپ بٍ راست)‬
‫‪ABHCDGIEFJK‬‬

‫‪4‬‬
‫پيمايش اول سطح ‪Breadth-first‬‬
‫بٍ مىظًر پيادٌ سازی پيمايص ايل سطح )‪(BFS‬‬ ‫•‬
‫– ابتذا يک صف از وًع ػىاصر آرايٍ می سازيم‬
‫– وًد ريطٍ را درين صف لرار می دَيم‪.‬‬
‫– تا َىگامی کٍ صف خالی وطذٌ‬
‫ػىصر ايل صف را ‪ delete‬می کىيم‪.‬‬ ‫•‬
‫ايه ػىصررا در خريجی چاپ کردٌ‬ ‫•‬
‫فرزوذان ايه ػىصر را (از چپ بٍ راست) بٍ درين صف ‪ Insert‬می کىيم‬ ‫•‬

‫وضعيت صف‬ ‫عناصر چاپ شده‬


‫‪A‬‬
‫‪BH‬‬ ‫‪A‬‬
‫مثال‪:‬‬ ‫•‬
‫‪HCDG‬‬ ‫‪AB‬‬
‫‪CDGI‬‬ ‫‪ABH‬‬

‫•‬ ‫‪DGI‬‬
‫‪GIEF‬‬
‫‪ABHC‬‬
‫‪ABHCD‬‬
‫‪IEF‬‬ ‫‪ABHCDG‬‬
‫‪EFJK‬‬ ‫‪ABHCDGI‬‬
‫‪FJK‬‬ ‫‪ABHCDGIE‬‬
‫‪JK‬‬ ‫‪ABHCDGIEF‬‬
‫‪K‬‬ ‫‪ABHCDGIEFJ‬‬
‫‪ABHCDGIEFJK‬‬

‫‪5‬‬
‫پيمايش اول عمق ‪Depth-first‬‬
‫در پيمايص ايل ػمك )‪ Depth-first Search (DFS‬از ريطٍ ضريع کردٌ ي با در وظر‬ ‫•‬
‫گرفته چپ تريه فرزوذ لبل از ماللات َمسادَای ديگر‪ ،‬ػمك بٍ ػمك در درخت پاييه می‬
‫رييم ي وًدَا را پيمايص می کىيم‪.‬‬

‫مطخصات‬ ‫•‬
‫– برای پيادٌ سازی ‪ DFS‬از پطتٍ استفادٌ می ضًد‬
‫– زمان اجرای آن )‪ ϴ(n‬کٍ ‪ n‬برابر تؼذاد وًدَاست‬
‫– ميسان حافظٍ الزم برابر )‪O(bh‬‬
‫کٍ ‪ h‬برابر ػمك ي ‪ b‬ماکسيمم درجٍ درخت است‪.‬‬

‫مثال‪ :‬در درخت ريبري‬ ‫•‬


‫پيمايص ‪ DFS‬برابر (از چپ بٍ راست)‬
‫‪ABCDEFGHIJKLM‬‬

‫‪6‬‬
‫پيمايش اول عمق ‪Depth-first‬‬
‫بٍ مىظًر پيادٌ سازی پيمايص ايل ػمك )‪(DFS‬‬ ‫•‬
‫– ابتذا يک پطتٍ از وًع ػىاصر آرايٍ می سازيم‬
‫– وًد ريطٍ را درين پطتٍ لرار می دَيم‪.‬‬
‫– تا َىگامی کٍ پطتٍ خالی وطذٌ‬
‫از پطتٍ يک ػىصر را ‪ Pop‬می کىيم‪.‬‬ ‫•‬
‫ايه ػىصررا در خريجی چاپ کردٌ‬ ‫•‬
‫فرزوذان ايه ػىصر را (از راست بٍ چپ) بٍ درين پطتٍ ‪ Push‬می کىيم‬ ‫•‬

‫وضعيت پشته‬ ‫عناصر چاپ شده‬


‫‪A‬‬
‫‪BH‬‬ ‫‪A‬‬
‫مثال‪:‬‬ ‫•‬
‫‪CEH‬‬ ‫‪AB‬‬
‫‪DEH‬‬ ‫‪ABC‬‬

‫•‬ ‫‪EH‬‬
‫‪FGH‬‬
‫‪ABCD‬‬
‫‪ABCDE‬‬
‫‪GH‬‬ ‫‪ABCDEF‬‬
‫‪H‬‬ ‫‪ABCDEFG‬‬
‫‪IM‬‬ ‫‪ABCDEFGH‬‬
‫‪J K LM‬‬ ‫‪ABCDEFGHI‬‬
‫‪KLM‬‬ ‫‪ABCDEFGHIJ‬‬
‫‪LM‬‬ ‫‪ABCDEFGHIJK‬‬
‫‪M‬‬ ‫‪ABCDEFGHIJKL‬‬
‫‪ABCDEFGHIJKLM‬‬ ‫‪7‬‬
‫پيمايش درخت دودويی‬
‫برای پيمايص درخت َای ديدييی سٍ پارامتر زير را تؼريف می کىيم‪.‬‬ ‫•‬
‫– ‪ : L‬زير درخت سمت چپ‬
‫– ‪ : V‬ممذار خًد وًد‬
‫– ‪ : R‬زير درخت سمت راست‬

‫با تًجٍ بٍ تؼاريف باال سٍ وًع پيمايص برای درخت َای ديدييی مًجًد است‬ ‫•‬
‫)‪(LVR‬‬ ‫‪ -‬ميان يوذی ‪In-Order‬‬
‫‪ -‬پيطًوذی ‪(VLR) Pre-Order‬‬
‫)‪(LRV‬‬ ‫‪ -‬پسًوذی ‪Post-Order‬‬

‫‪8‬‬
‫پيمايش ميان وندی ‪In-Order‬‬
‫)‪(LVR‬‬
‫در پيمايص ميان وندی ‪ In-Order‬بر اساس الگًی ‪ LVR‬پيمايص را از وًد ريطٍ ضريع ي‬ ‫•‬
‫بر ريی َر کذام از زير درخت َايص اػمال می کىذ‬

‫مطخصات‬ ‫•‬
‫– برای پيادٌ سازی از تابغ بازگطتی استفادٌ می ضًد‬
‫– زمان اجرای آن )‪ ϴ(n‬کٍ ‪ n‬برابر تؼذاد وًدَاست‬

‫مثال‪ :‬در درخت ريبري‬ ‫•‬


‫پيمايص ‪ LVR‬برابر‬
‫‪A, B, C, D, E, F, G, H, I, J‬‬
‫‪L‬‬ ‫‪V‬‬ ‫‪R‬‬ ‫•‬

‫‪9‬‬
In-Order ‫پيمايش ميان وندی‬
(LVR)
In-Order ‫پيادٌ سازی پيمايص‬ •
template <typename Type>
void Binary_tree<Type>::in_order_traversal() const {
if ( left() != nullptr ) {
left()->in_order_traversal();
} L V R LVR
cout << value(); A, B, C, D, E, F, G, H, I, J
if ( right() != nullptr ) { L V R •
right()->in_order_traversal();
}
}

10
‫پيمايش پيشوندی ‪Pre-Order‬‬
‫)‪(VLR‬‬
‫در پيمايص پيشوندی ‪ Pre-Order‬بر اساس الگًی ‪ VLR‬پيمايص را از وًد ريطٍ ضريع‬ ‫•‬
‫ي بر ريی َر کذام از زير درخت َايص اػمال می کىذ‬

‫مطخصات‬ ‫•‬
‫– برای پيادٌ سازی از تابغ بازگطتی استفادٌ می ضًد‬
‫– زمان اجرای آن )‪ ϴ(n‬کٍ ‪ n‬برابر تؼذاد وًدَاست‬

‫مثال‪ :‬در درخت ريبري‬ ‫•‬


‫پيمايص ‪ VLR‬برابر‬
‫‪G, D, B, A, C, E, F, I, H, J‬‬
‫‪V‬‬ ‫‪L‬‬ ‫‪R‬‬ ‫•‬

‫‪11‬‬
Pre-Order ‫پيمايش پيشوندی‬
(VLR)
Pre-Order ‫پيادٌ سازی پيمايص‬ •
template <typename Type>
void Binary_tree<Type>::pre_order_traversal() const {
cout << value();

if ( left() != nullptr ) { V L R VLR


left()->pre_order_traversal();
} G, D, B, A, C, E, F, I, H, J
V L R •
if ( right() != nullptr ) {
right()->pre_order_traversal();
}
}

12
‫پيمايش پسوندی ‪Post-Order‬‬
‫)‪(LRV‬‬
‫در پيمايص پسوندی ‪ Post-Order‬بر اساس الگًی ‪ LRV‬پيمايص را از وًد ريطٍ ضريع‬ ‫•‬
‫ي بر ريی َر کذام از زير درخت َايص اػمال می کىذ‬

‫مطخصات‬ ‫•‬
‫– برای پيادٌ سازی از تابغ بازگطتی استفادٌ می ضًد‬
‫– زمان اجرای آن )‪ ϴ(n‬کٍ ‪ n‬برابر تؼذاد وًدَاست‬

‫مثال‪ :‬در درخت ريبري‬ ‫•‬


‫پيمايص ‪ LRV‬برابر‬
‫‪A, C, B, F, E, D, H, J, I, G‬‬
‫‪L‬‬ ‫‪R V‬‬ ‫•‬

‫‪13‬‬
Post-Order ‫پيمايش پسوندی‬
(LRV)
Post-Order ‫پيادٌ سازی پيمايص‬ •
template <typename Type>
void Binary_tree<Type>::post_order_traversal() const {
if ( left() != nullptr ) {
left()->post_order_traversal();
} L R V LRV
if ( right() != nullptr ) { A, C, B, F, E, D, H, J, I, G
right()->post_order_traversal();
} L R V •
cout << value();
}

14
‫بازيابی درخت دودويی‬

‫برای بازيابی درخت دودويی با استفاده از پيمايش های آن به دو پيمايش زير نياز‬ ‫•‬
‫است‪:‬‬
‫– يکی از دي پيمايص ‪ Pre-Order‬ي ‪Post-Order‬‬
‫(با استفادٌ از ايه پيمايص وًد ريطٍ َر زير درخت مطخص می ضًد)‬ ‫•‬
‫– پيمايص ‪ In-Order‬درخت‬
‫با استفادٌ از ايه پيمايص وًدَای سمت چپ ي راست َر زير درخت مطخص می ضًد‬ ‫•‬

‫• برای مثال‬
‫پيمايص ‪ VLR‬برابر‬
‫‪G, D, B, A, C, E, F, I, H, J‬‬
‫‪V‬‬ ‫‪L‬‬ ‫‪R‬‬ ‫•‬
‫پيمايص ‪ LVR‬برابر‬
‫‪A, B, C, D, E, F, G, H, I, J‬‬
‫‪L‬‬ ‫‪V‬‬ ‫‪R‬‬ ‫•‬
‫‪15‬‬

You might also like