Transcript Document

‫ساختمان داده‬
‫درخت‌ها‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫تعاریف‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪2‬‬
‫تعریف درخت‬
‫• تعريف‪ :‬درخت مجموعه اي متناهي و غير تهي از يک يا چند گره است به‬
‫طوريکه‪:‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪3‬‬
‫‪ ‬داراي گره خاص ي به نام ريشه باشد‪.‬‬
‫‪‬گره‌های دیگر زیر درختان ریشه‬
‫‪ ‬مجموعه مجزا ‪ T1,…,Tn‬که هر يک از اين مجموعه ها خود يک درخت‬
‫هستند‪.‬‬
‫• یک گراف غير جهت دار و بدون دور‌‬
‫ریشه‪ ،‬برگ‪ ،‬گره و یال‬
‫ریشه‬
‫تعداد = ‪e‬‬
‫یال‬
‫‪12‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪4‬‬
‫تعداد = ‪n‬‬
‫‪13‬‬
‫گره‬
‫برگ‬
‫تعاریف‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪5‬‬
‫• ریشه‬
‫• گره بدون پدر (‪)a‬‬
‫• برگ‬
‫• گره بدون فرزند| بدون زیر درخت (‪)b, d, f, g, j, k, l, m‬‬
‫• گره داخلی‬
‫• گره غير برگ (‪)a, c, e, h, i‬‬
‫• گره ‪ j‬و ‪k‬‬
‫• فرزندان ‪h‬‬
‫• گره‌های همزاد‪ ،‬هم‌نیا‪ ،‬برادر یا ‪sibling‬‬
‫تعاریف‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪6‬‬
‫• درجه‬
‫• گره‪ :‬تعداد زیر درختان گره‬
‫• درخت‪ :‬ماکزیمم درجه گره‌های درخت‬
‫• اجداد گره‬
‫• گره‌های موجود در مسير طی شده تا ریشه‬
‫• ‪i, e, a ← m‬‬
‫• سطح (عمق) یک گره‬
‫• طول مسير از ریشه به آن گره‬
‫• ‪ 1 ← a‬و‪3 ← h‬‬
‫تعاریف‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪7‬‬
‫• ارتفاع (عمق) درخت‬
‫• بیشترین سطح گره‌ها‬
‫•‪4‬‬
‫• سوال‬
‫• سطح ‪ f‬برابر ؟ است‪.‬‬
‫• عمق (ارتفاع) درخت برابر ؟ است‪.‬‬
‫• درجه نود ‪ c‬برابر ؟ است‪.‬‬
‫• درجه درخت برابر ؟ است‪.‬‬
‫• اجداد ‪ c‬برابر ? است‪.‬‬
‫• نسل هاي ‪ h‬برابر ? است‪.‬‬
‫نمایش درخت عمومی‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪8‬‬
‫ی‬
‫پرانتزگذار ‌‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪9‬‬
‫• ابتدا ریشه‬
‫• اطالعات فرزندان ریشه در پرانتز‬
‫• اطالعات فرزندان از چپ به راست‬
‫))))‪(a(b), (c(f, g, h(j, k))), (d), (e(i(l, m‬‬
‫آرایه‬
‫• ذخيره‬
‫• مقدار هر گره (‪)element‬‬
‫• شماره درایه پدر هر عنصر‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪10‬‬
‫لیست پیوندی‬
‫• درخت روبرو را مي توان در قالب ليست‬
‫به صورت زير نشان داد‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪11‬‬
‫)))‪(A(B(E(K ،L)،F)،C(G)،D(H(M)،I،J‬‬
‫فرزند چپ‪ ،‬همزاد راست‬
‫• هر گره حداکثر درای‬
‫• ‪ 1‬فرزند چپ‬
‫• ‪ 1‬همزاد راست‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪12‬‬
‫• تبدیل درخت عمومی به‬
‫درخت دودویی‬
‫درخت دودویی‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪13‬‬
‫تعریف‬
‫• درخت ‪ k‬تایی‬
‫• درختی که بیشینه تعداد فرزندان یک گره ‪ k‬باشد‪.‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪14‬‬
‫• درخت دودویی‬
‫• حداکثر تعداد فرزندان هر گره = ‪2‬‬
‫• تفاوت با درخت عادی‬
‫• می‌تواند دارای صفر گره باشد !‬
‫• ترتیب فرزندان اهمیت دارد‪.‬‬
‫تبدیل درخت عمومی به دودویی‬
‫• هر درختي را مي توان به فرم درخت دودويي در آورد‪.‬‬
‫• با بازنمايي بچه چپ‪-‬همزاد راست‬
‫• در درختهاي دودويي بين‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪15‬‬
‫زير درخت چپ و راست‬
‫تمايز قائل مي‌شويم‪.‬‬
‫انواع درخت‬
‫• پر‬
‫• همه گره‌ها بجز سطح آخر ‪ 2‬فرزند دارند‪.‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪16‬‬
‫)‪ℎ = log 𝑛 + 1 = log(𝑛 + 1‬‬
‫• تعداد گره سطح ‪2𝑖−1 ← i‬‬
‫• تعداد کل گره‌ها ← ‪n = 2ℎ − 1‬‬
‫• تعداد کل برگ‌ها ← ‪𝑛0 = 2ℎ−1‬‬
‫• تعداد گره‌های داخلی ← ‪2ℎ−1 − 1‬‬
‫انواع درخت‬
‫• کامل‬
‫• تا ارتفاع ‪ h-1‬پر‬
‫• برگها در ارتفاع ‪ h‬از چپ به راست پر می‌شوند‪.‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪17‬‬
‫)‪ℎ = log 𝑛 + 1 = log(𝑛 + 1‬‬
‫• تعداد گره‌ها‬
‫‪2ℎ−1 ≤ 𝑛 ≤ 2ℎ − 1‬‬
‫انواع درخت‬
‫• اریب‬
‫• درجه رئوس بجز آخری برابر ‪1‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫• تعداد گره‌ تک فرزندی‬
‫• ‪n-1‬‬
‫• تعداد برگ‌ها‬
‫• ‪1‬‬
‫• ارتفاع‬
‫‪18‬‬
‫• ‪h=n‬‬
‫انواع درخت‬
‫• متواز ‌ن‬
‫• اختالف سطح برگها ‪ 0‬یا ‪1‬‬
‫• برگها در سطح ‪ h‬یا ‪h-1‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪19‬‬
‫• کامال متواز ‌ن‬
‫• تمام برگها در یک سطح‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪20‬‬
‫خصوصیات‬
‫درخت دودویی‬
‫تعداد یالها‬
‫‪𝑒 =𝑛−1‬‬
‫‪𝑒 = 2𝑛2 + 𝑛1‬‬
‫‪𝑛0 = 𝑛2 + 1‬‬
‫‪𝑛 = 𝑛0 + 𝑛1 + 𝑛2‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪21‬‬
‫• ‪ : 𝑛0‬تعداد گره های درجه ‪ 0‬یا تعداد برگها‬
‫• ‪ : 𝑛1‬تعداد گره های درجه ‪1‬‬
‫• ‪ : 𝑛2‬تعداد گره های درجه ‪2‬‬
‫تعداد برگ‌ها‬
‫‪𝑛0 = 𝑛2 + 1‬‬
‫• در درخت کامل و پر ←‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪22‬‬
‫درخت پر‬
‫‪𝑛+1‬‬
‫‪2‬‬
‫= ‪𝑛0‬‬
‫‪1 ≤ 𝑛0 ≤ 2ℎ−1‬‬
‫‪𝑛+1‬‬
‫≤ ‪1 ≤ 𝑛0‬‬
‫‪2‬‬
‫عمق‪ ،‬تعداد گره‬
‫درخت اریب‬
‫• تعداد گره‌ها‬
‫𝑛 ≤ ‪log 𝑛 + 1 ≤ ℎ‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫درخت پر‬
‫‪1 ≤ 𝑛𝑖 ≤ 2𝑖−1‬‬
‫درخت پر‬
‫‪h ≤ 𝑛 ≤ 2ℎ − 1‬‬
‫درخت اریب‬
‫‪23‬‬
‫درخت پر یا‬
‫کامل‬
‫تعداد درخت دودویی مختلف‬
‫• تعداد درخت‌های مختلف که با ‪ n‬گره می‌توان ساخت‪:‬‬
‫• تعداد درخت‌های دودویی کامل = تعداد برگهای ارتفاع ‪2ℎ−1 = h‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪24‬‬
‫• تعداد درخت‌های متفاوت با ‪ n‬گره =‬
‫‪1‬‬
‫𝑛‪2‬‬
‫𝑛 ‪𝑛+1‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪25‬‬
‫نمایش‬
‫درخت دودویی‬
‫آریه‬
‫• شماره گذاری گره‌ها به صورت زیر‬
‫𝑖‬
‫‪2𝑖 + 1‬‬
‫𝑖‪2‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫• قراردادن عناصر در آرایه براساس مکانشان‬
‫𝑎‬
‫𝑐‬
‫𝑏‬
‫𝑑‬
‫‪26‬‬
‫آرایه‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫• تعداد خانه‌های مورد نیاز برای درخت‬
‫• پر ← 𝑛‬
‫• اریب‬
‫• چپ ← ‪2𝑛−1‬‬
‫• راست ← ‪2𝑛 − 1‬‬
‫‪3‬‬
‫‪7‬‬
‫‪15‬‬
‫‪27‬‬
‫‪1‬‬
‫‪1‬‬
‫‪2‬‬
‫‪4‬‬
‫‪8‬‬
‫آرایه‬
‫• هدر رفتن حافظه‬
‫• اریب‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪28‬‬
‫• چپ ← 𝑛 ‪2𝑛−1 −‬‬
‫• راست ← 𝑛 ‪2𝑛 − 1 −‬‬
‫لیست پیوندی‬
‫𝑎𝑡𝑎𝑑‬
‫‪right_child‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪29‬‬
‫𝑑𝑙𝑖‪𝑙𝑒𝑓𝑡_𝑐ℎ𝑖𝑙𝑑 𝑟𝑖𝑔ℎ𝑡_𝑐ℎ‬‬
‫‪data‬‬
‫‪left_child‬‬
‫لیست پیوندی‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪30‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪31‬‬
‫پیمایش‬
‫درخت دودویی‬
‫تعریف پیمایش درخت‬
‫بار‬
‫• می‌خواهیم با حرکت روی یالهای یک درخت‪ ،‬همه گره‌های آن را یک ‌‬
‫مالقات کنیم‪.‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪32‬‬
‫• پیمایش سطحی‬
‫• پیمایش عمقی‬
‫• پیش ترتیب‪Preorder ،‬‬
‫• میان ترتیب‪Inorder ،‬‬
‫• پس ترتیب‪Prostorder ،‬‬
‫پيمايش درخت دودويي‬
‫• طي كردن هر گره درخت يك و فقط يك بار‬
‫• ‪ 6‬تركيب مختلف كنار هم قرار دادن )‪:r(root),L(Left),R(Right‬‬
‫• (‪)rLR,rRL,LrR,LRr,RrL,RLr‬‬
‫• اگر زير درخت چپ قبل از زيردرخت راست پيمايش شود‪،‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪33‬‬
‫• ‪ 3‬حالت مختلف ايجاد مي شود‪:‬‬
‫‪r‬‬
‫‪r‬‬
‫‪r‬‬
‫‪2‬‬
‫‪1‬‬
‫‪3‬‬
‫‪R‬‬
‫‪2‬‬
‫‪1‬‬
‫‪L‬‬
‫‪LRr‬‬
‫‪postorder‬‬
‫‪R‬‬
‫‪3‬‬
‫‪1‬‬
‫‪LrR‬‬
‫‪inorder‬‬
‫‪L‬‬
‫‪R‬‬
‫‪3‬‬
‫‪2‬‬
‫‪rLR‬‬
‫‪preorder‬‬
‫‪L‬‬
‫پیمایش سطحی‬
‫• حرکت از باال به پایين‬
‫• حرکت از چپ به راست‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪34‬‬
‫• پیاده‌سازی به کمک صف‬
‫𝒄𝒃× 𝒂‪−‬‬
void level_order(tree_pointer ptr)
{
int front = rear = 0;
tree_pointer queue[MAX_QUEUE_SIZE];
if (!ptr) return; /* empty tree */
addq(front, &rear, ptr);
for (;;) {
ptr = deleteq(&front, rear);
if (ptr) {
printf(ptr.data);
if (ptr.left_child)
addq(front, &rear, ptr.left_child);
if (ptr.right_child)
addq(front, &rear, ptr.right_child);
}
else break;
}
}
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫پیمایش سطحی‬
35
‫پیمایش ‪Preorder‬‬
‫• مالقات ریشه‬
‫• اگر زیر درخت چپ داشتیم ← پیمایش چپ بروش ‪Preorder‬‬
‫• اگر زیر درخت راست داشتیم ← پیمایش راست بروش ‪Preorder‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪36‬‬
‫𝟓𝟒𝟑𝟐𝟏‬
‫ریشه‬
‫𝒅 𝒄 < 𝒃 𝒂 < 𝒓𝒐‬
‫راست ترین برگ‬
‫پیمایش ‪Preorder‬‬
‫• الگوریتم‬
‫• بازگشتی‬
‫• غير بازگشتی به کمک پشته‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪37‬‬
‫• ‪ Push‬به تعداد فرزندان راست‬
‫• ‪ Pop‬به تعداد فرزندان راست‬
‫پیمایش ‪Inorder‬‬
‫• اگر زیر درخت چپ داشتیم ← پیمایش چپ بروش ‪Inorder‬‬
‫• مالقات ریشه‬
‫• اگر زیر درخت راست داشتیم ← پیمایش راست بروش ‪Inorder‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪38‬‬
‫𝟐𝟓𝟑𝟒𝟏‬
‫راست‌ترین گره در امتداد ریشه‬
‫𝒅 < 𝒄 𝒓𝒐 𝒃 < 𝒂‬
‫چپ‌ترین گره در امتداد ریشه‬
‫پیمایش ‪Postorder‬‬
‫• اگر زیر درخت چپ داشتیم ← پیمایش چپ بروش ‪Postorder‬‬
‫• اگر زیر درخت راست داشتیم ← پیمایش راست بروش‬
‫• مالقات ریشه‬
‫‪Postorder‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪39‬‬
‫𝟏𝟐𝟑𝟓𝟒‬
‫ریشه‬
‫𝒓𝒐 < 𝒅 𝒄 < 𝒃 𝒂‬
‫چپ‌ترین برگ‬
‫نکته‬
‫• ترتیب مالقات برگ ها‬
‫• در هر ‪ 3‬پیمایش یکسان‬
‫• همواره از چپ به راست‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫𝒅 𝒄 < 𝒃 𝒂 < 𝒓𝒐‬
‫𝒅 < 𝒄 𝒓𝒐 𝒃 < 𝒂‬
‫𝒓𝒐 < 𝒅 𝒄 < 𝒃 𝒂‬
‫‪40‬‬
‫‪Preorder‬‬
‫‪Inorder‬‬
‫‪Postorder‬‬
void inorder (tree_pointer ptr)
{
if (ptr) {
inorder(ptr.left_child);
printf(ptr.data);
inorder(ptr.right_child);
}
}
void preorder (tree_pointer ptr)
{
if (ptr) {
printf(ptr.data);
preorder(ptr.left_child);
preorder(ptr.right_child);
}
}
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫توابع پيمايش درخت‬
41
inorder ‫پيمايش غير بازگشتي‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
void iter_inorder(tree_pointer node)
{
int top = -1; /* initialize stack */
tree_pointer stack[MAX_STACK_SIZE];
for (;;) {
for (; node; node = node.left_child)
add(&top, node);
// add to stack
node = delete(&top); // delete from stack
if (!node) break;
// empty stack */
printf(node.data);
node = node.right_child;
}
42
}
‫ساخت درخت دودویی به کمک پیمایش‌های آن‬
‫• مثال‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪43‬‬
‫‪abcdefgh‬‬
‫‪bcaedgfh‬‬
‫‪• Preorder‬‬
‫‪• Inorder‬‬
‫درخت عبارت‬
*
*
A
D
C
/
B
E
inorder traversal
A/B*C*D+E
infix expression
preorder traversal
+**/ABCDE
prefix expression
postorder traversal
AB/C*D*E+
postfix expression
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
+
44
‫سوال‬
‫• الگوريتمي به نام ‪ swaptree‬بنويسيد که يک درخت دودويي را دريافت‬
‫هر گره را عوض کند‪.‬‬
‫کند ‌و جاي بچه هاي چپ ‌و راست ‌‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪45‬‬
‫غير برگ | کل‬
‫• الگوريتمي براي شمارش تعداد گره هاي برگ | گره هاي ‌‬
‫در يک درخت دودويي بنويسيد‪.‬‬
‫گره ها ‌‬
‫در يک درخت دودويي بنويسيد‪.‬‬
‫• الگوريتمي براي حذف تمام گره ها ‌‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪46‬‬
‫عملیات‬
‫درخت دودویی‬
‫کپی درخت دودویی‬
‫• مي‌توانيم الگوريتم پيمايش پس ترتيب درخت دودويي را اندکي تغيير‬
‫دهيم تا براي کپي درخت به کار رود‪.‬‬
‫• برابرای دو درخت‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪47‬‬
‫• ترتیب و ساختار گره‌ها یکسان‬
‫• داده‌‌های گره‌‌ها یکسان‬
‫محاسبه عبارات گزاره اي‬
‫)‪x1  (x2  ¬x3‬‬
‫‪• x1 and x3 =false, x2 = true‬‬
‫‪• false  (true  ¬false) = false  true = true‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪48‬‬
‫• پيمايش پس ترتيب‪:‬‬
‫• براي ارزيابي هر گره بايد قبال آرگومان‌هاي آ‌ن را محاسبه کرده باشيم‪.‬‬
‫محاسبه عبارات گزاره اي‬
‫‪(x1  ¬x2)  (¬ x1  x3)  ¬x3‬‬
‫‪‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪‬‬
‫‪‬‬
‫‪data‬‬
‫‪‬‬
‫‪X3‬‬
‫‪‬‬
‫‪‬‬
‫‪X3‬‬
‫‪‬‬
‫‪49‬‬
‫‪X1‬‬
‫‪X2‬‬
‫‪value‬‬
‫‪X1‬‬
‫درخت نخی دودویی‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪50‬‬
‫درخت نخی‬
‫حسین دهقان‬
‫دانشکده فنی و مهندسی‬
‫جم‬
‫‪51‬‬
‫• نخ کش ي کردن‬
‫• عيب درختهاي دودويي باال‪ :‬تعداد زيادي از اشاره گرها ‪ NULL‬است‬
‫تعداد گره ‪n‬‬
‫تعداد اشاره گر غير صفر ‪n-1‬‬
‫تعداد کل اشاره گر ها ‪2n‬‬
‫تعداد اشاره گر صفر ‪n+1‬‬
‫• راهکار‪ :‬از اشاره گرهاي تهی براي اشاره به گره هاي ديگر درخت‬
‫استفاده کنيم‪ .‬به چنين اشاره گرهايي نخ گويند‪.‬‬
‫درخت دودويي نخ كش ي شده (‪)Threaded‬‬
‫ترتيب‬
‫• از اشاره گرهاي خالي براي اشاره به عنصر قبل و عنصر بعد در ‌‬
‫‪ inorder‬استفاده مي شود‪.‬‬
‫‪root‬‬
‫‪A‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪52‬‬
‫‪dangling‬‬
‫‪C‬‬
‫‪G‬‬
‫‪B‬‬
‫‪F‬‬
‫‪inorder traversal:‬‬
‫‪H, D, I, B, E, A, F, C, G‬‬
‫‪E‬‬
‫‪D‬‬
‫‪I‬‬
‫‪dangling‬‬
‫‪H‬‬
‫ساختمان داده براي گره هاي درخت نخ كش ي شده‬
left_child
TRUE
TRUE: thread

data
right_child right_thread

FALSE
FALSE: child
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
left_thread
53
‫درخت نخ كش ي شده‪ :‬مثال‬
‫‪--‬‬
‫‪f‬‬
‫‪f‬‬
‫‪A‬‬
‫‪f‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪54‬‬
‫‪C‬‬
‫‪f‬‬
‫‪t‬‬
‫‪G‬‬
‫‪t‬‬
‫‪root‬‬
‫‪f‬‬
‫‪f‬‬
‫‪t‬‬
‫‪B‬‬
‫‪f‬‬
‫‪F‬‬
‫‪t‬‬
‫‪E‬‬
‫‪t‬‬
‫‪t‬‬
‫‪t‬‬
‫‪I‬‬
‫‪f‬‬
‫‪D‬‬
‫‪f‬‬
‫‪t‬‬
‫‪t‬‬
‫‪f‬‬
‫‪H‬‬
‫‪t‬‬
‫پيمايش ميان ترتيب‬
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫‪55‬‬
‫• با استفاده از نخ کشيها مي توان پيمايش ميان ترتيب را بد ‌ون‬
‫استفاده از پشته انجام داد‪.‬‬
‫‪ -1‬اگر ‪ ptr.right_thread = TRUE‬باشد آنگاه عضو بعد از ‪ ptr‬در روش‬
‫ميان ترتيب ‪ ptr . right_child‬است‪.‬‬
‫‪ -2‬در غير اينصورت عضو بعد از ‪ ptr‬در روش ميان ترتيب با دنبال‬
‫کردن مسيري از اشاره گرهاي بچه چپ از بچه راست ‪ ptr‬به‬
‫دست مي ايد تا به گره اي با ‪ left_thread = TRUE‬برسيم‪.‬‬
threaded_pointer insucc(threaded_pointer tree){
threaded_pointer temp;
temp = tree.right_child;
if (!tree.right_thread)
while (!temp.left_thread)
temp = temp.left_child;
return temp;
}
tree
temp
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
)Successor( ‫پيدا کردن عضو بعدي‬
56
void tinorder(threaded_pointer tree){
threaded_pointer temp = tree;
for (;;) {
temp = insucc(temp);
if (temp==tree)
break;
printf(temp.data);
}
}
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
‫پيمايش ميان ترتيب‬
57
‫اضافه کردن گره‬
‫• اضافه کردن يک گره به عنوان بچه راست يک گره والد‬
‫‪root‬‬
‫حسین دهقان‬
‫دانشکده فنی و مهندسی‬
‫جم‬
‫‪58‬‬
‫‪parent‬‬
‫‪child‬‬
‫‪X‬‬
‫‪parent‬‬
‫‪A‬‬
‫‪B‬‬
‫‪B‬‬
‫‪child‬‬
‫‪D‬‬
‫‪F‬‬
‫‪A‬‬
‫‪X‬‬
‫حالت اول‪:‬‬
‫‪E‬‬
‫حالت دوم‪:‬‬
‫زير درخت راست ‪B‬خالي نباشد‬
‫زير درخت راست ‪ B‬خالي باشد‬
‫اضافه کردن گره‬
root
parent
A
B
X
parent
child
child
temp
‫حسین دهقان‬
‫دانشکده فنی و مهندس ی جم‬
void insert_right(parent, child){
threaded_pointer temp;
child.right_child = parent.right_child;
child.right_thread = parent.right_thread;
child.left_child = parent;
child.left_thread = TRUE;
parent.right_child = child;
A
parent.right_thread = FALSE;
If(!child.right_thread){
B
temp = insucc(child);
temp.left_child = child;
}
‫حالت اول‬
‫حالت‬
‫دوم‬
}
X
59
D
E
successor
F