ساختمان داده درختها
DESCRIPTION
ساختمان داده درختها. حسین دهقان دانشکده فنی و مهندسی جم. تعاریف. تعریف درخت. تعريف: درخت مجموعه اي متناهي و غير تهي از يک يا چند گره است به طوريکه: داراي گره خاصي به نام ريشه باشد. گرههای دیگر زیر درختان ریشه مجموعه مجزا T 1 ,…, T n که هر يک از اين مجموعه ها خود يک درخت هستند . - PowerPoint PPT PresentationTRANSCRIPT
ساختمان داده
درخت هاحسین دهقاندانشکده فنی و مهندسی جم
تعاریف
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
2
تعریف درختتعريف: درخت مجموعه اي متناهي و غير تهي از •
يک يا چند گره است به طوريکه: باشد.ريشهداراي گره خاصي به نام ریشهزیر درختان گره های دیگر
مجموعه مجزا T1,…,Tn که هر يک از اين مجموعه ها خود يک درخت هستند.
یک گراف غیر جهت دار و بدون دور•
3
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
ریشه، برگ، گره و یال
4
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
ریشه
برگ
گره
یال
nتعداد = 13
eتعداد = 12
تعاریفریشه•
(aگره بدون پدر )•برگ•
,b, d, f, g, j, kبدون زیر درخت ) |گره بدون فرزند•l, m)
داخلیگره •(a, c, e, h, iگره غیر برگ )•kو jگره •
hفرزندان •
sibling یا برادر، هم نیا، همزادگره های •5
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
تعاریف
6
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
درجه•گره: تعداد زیر درختان گره•درخت: ماکزیمم درجه گره های درخت•اجداد گره•
گره های موجود در مسیر طی شده تا ریشه••m ← i, e, a( یک گرهعمق )سطح•
طول مسیر از ریشه به آن گره••a ← 1 و h ← 3
تعاریف
7
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
( درختعمق)ارتفاع •بیشترین سطح گره ها••4سوال•است.؟ برابر f سطح•است.؟ درخت برابر عمق )ارتفاع(•است.؟ برابر c نود درجه•است.؟ درخت برابر درجه•است. ?برابر c اجداد•است.? برابر h نسل هاي•
نمایش درخت عمومی
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
8
پرانتزگذاریابتدا ریشه•اطالعات فرزندان ریشه در پرانتز•اطالعات فرزندان از چپ به راست•
9
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
(a(b), (c(f, g, h(j, k))), (d), (e(i(l, m))))
آرایه
10
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
ذخیره•(elementمقدار هر گره )•شماره درایه پدر هر عنصر•
لیست پیوندیدرخت روبرو را مي توان در •
قالب ليست به صورت زير نشان داد
11
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
(A(B(E(K ،L)،F)،C(G)،D(H(M)،I،J)))ج
فرزند چپ، همزاد راستهر گره حداکثر درای •
فرزند چپ1• همزاد راست1•
تبدیل درخت عمومی به •دودویی درخت
12
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
درخت دودویی
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
13
تعریف تاییkدرخت •
kدرختی که بیشینه تعداد فرزندان یک گره •باشد.
درخت دودویی•2حداکثر تعداد فرزندان هر گره = •تفاوت با درخت عادی•
می تواند دارای صفر گره باشد !•ترتیب فرزندان اهمیت دارد.•
14
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
تبدیل درخت عمومی به دودوییهر درختي را مي توان به فرم درخت دودويي در •
آورد.
با بازنمايي بچه چپ-همزاد راست•
در درختهاي دودويي بين •
زير درخت چپ و راست
تمايز قائل مي شويم.
15
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
انواع درختپر• فرزند دارند.2همه گره ها بجز سطح آخر •
← iتعداد گره سطح •← تعداد کل گره ها • ←تعداد کل برگ ها •← تعداد گره های داخلی •
16
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
h=⌊ log𝑛 ⌋+1=log(𝑛+1)
انواع درختکامل• پرh-1تا ارتفاع •از چپ به راست پر hبرگها در ارتفاع •
می شوند.
تعداد گره ها•
17
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
h=⌊ log𝑛 ⌋+1=⌈ log(𝑛+1)⌉
2h− 1≤𝑛≤2h−1
انواع درختاریب•1درجه رئوس بجز آخری برابر •
تعداد گره تک فرزندی••n-1
تعداد برگ ها••1
ارتفاع••h = n
18
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
انواع درختمتوازن•1 یا 0اختالف سطح برگها •h-1یا hبرگها در سطح •
کامال متوازن•تمام برگها در یک سطح•
19
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
خصوصیاتدرخت دودویی
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
20
تعداد یالها
یا تعداد برگها0 : تعداد گره های درجه •1 : تعداد گره های درجه •2 : تعداد گره های درجه •
21
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
تعداد برگ ها
← در درخت کامل و پر •
22
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
درخت پر
عمق، تعداد گره
تعداد گره ها•
23
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
درخت پر
درخت اریب
درخت پر یا کامل
درخت پر
درخت اریب
تعداد درخت دودویی مختلفگره می توان nتعداد درخت های مختلف که با •
ساخت:
تعداد درخت های دودویی کامل = تعداد برگهای •= hارتفاع
گره = nتعداد درخت های متفاوت با •
24
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
نمایشدرخت دودویی
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
25
آریهشماره گذاری گره ها به صورت زیر•
قراردادن عناصر در آرایه براساس مکانشان•
26
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
𝑖
2 𝑖 2 𝑖+1
𝑎
𝑏 𝑐
𝑑
آرایه
تعداد خانه های مورد نیاز برای درخت•← پر •اریب•
← چپ •← راست •
27
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
2
4
1
8
3
7
1
15
آرایه
هدر رفتن حافظه•اریب•
← چپ •← راست •
28
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
لیست پیوندی
29
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
𝑑𝑎𝑡𝑎
𝑙𝑒𝑓𝑡𝑐 h 𝑖𝑙𝑑𝑟𝑖𝑔h 𝑡𝑐 h 𝑖𝑙𝑑
left_child data right_child
لیست پیوندی
30
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
پیمایشدرخت دودویی
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
31
تعریف پیمایش درختمی خواهیم با حرکت روی یالهای یک درخت، همه •
گره های آن را یک بار مالقات کنیم.
پیمایش سطحی•پیمایش عمقی•
Preorderپیش ترتیب، •
Inorderمیان ترتیب، •
Prostorderپس ترتیب، •
32
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
پيمايش درخت دودوييطي كردن هر گره درخت يك و فقط يك بار• تركيب مختلف كنار هم قرار دادن 6•
r(root),L(Left),R(Right):•(rLR,rRL,LrR,LRr,RrL,RLr)
اگر زير درخت چپ قبل از زيردرخت راست •پيمايش شود،
حالت مختلف ايجاد مي شود:3•
33
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
L R
r
L R
r
L R
r
rLRpreorder
1
2 3 1
2
3 1 2
3
LrRinorder
LRrpostorder
پیمایش سطحیحرکت از باال به پایین•حرکت از چپ به راست•
پیاده سازی به کمک صف•
34
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
−𝒂×𝒃𝒄
پیمایش سطحی
35
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
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; }}
Preorderپیمایش
ریشهمالقات • چپ← پیمایش اگر زیر درخت چپ داشتیم •
Preorderبروش راست← پیمایش اگر زیر درخت راست داشتیم •
Preorderبروش
36
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
𝟏𝟐𝟑𝟒𝟓𝒐𝒓 <𝒂𝒃<𝒄 𝒅
راست ترین برگریشه
Preorderپیمایش
الگوریتم•بازگشتی•غیر بازگشتی به کمک پشته•
•Push به تعداد فرزندان راست•Pop به تعداد فرزندان راست
37
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
Inorderپیمایش
چپ← پیمایش اگر زیر درخت چپ داشتیم •Inorderبروش
ریشهمالقات • راست← پیمایش اگر زیر درخت راست داشتیم •
Inorderبروش
38
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
𝟏𝟒𝟑𝟓𝟐𝒂<𝒃𝒐𝒓 𝒄<𝒅
راست ترین گره در امتداد ریشه
چپ ترین گره در امتداد ریشه
Postorderپیمایش
چپ← پیمایش اگر زیر درخت چپ داشتیم •Postorderبروش
راست← پیمایش اگر زیر درخت راست داشتیم •Postorderبروش
ریشهمالقات •
39
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
𝟒𝟓𝟑𝟐𝟏𝒂𝒃<𝒄𝒅<𝒐𝒓
چپ ترین برگریشه
نکتهترتیب مالقات برگ ها•
پیمایش یکسان3در هر •همواره از چپ به راست•
40
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
𝒐𝒓 <𝒂𝒃<𝒄 𝒅𝒂<𝒃𝒐𝒓 𝒄<𝒅𝒂𝒃<𝒄𝒅<𝒐𝒓
PreorderInorderPostorder
توابع پيمايش درخت
41
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
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); }}
inorderپيمايش غير بازگشتي
42
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
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; }}
ساخت درخت دودویی به کمک پیمایش های آن
مثال•
• Preorder a b c d e f g h• Inorder b c a e d g f h
43
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
درخت عبارت
44
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
+
*
A
*
/
E
D
C
B
inorder traversalA / B * C * D + Einfix expression
preorder traversal+ * * / A B C D Eprefix expression
postorder traversalA B / C * D * E +postfix expression
سوالبنويسuيد کuه يuک درخت swaptreeالگuوريتمي بuه نuام •
و هuاي چپ بچuه جuاي و کنuد دريuافت را دودويي راست هر گره را عوض کند.
الگuوريتمي بuراي شuمارش تعuداد گuره هuاي بuرگ | •گuره هuاي غuير بuرگ | کuل گuره هuا در يuک درخت
دودويي بنويسيد.
الگuوريتمي بuراي حuذف تمuام گuره هuا در يuک درخت •دودويي بنويسيد. 45
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
عملیاتدرخت دودویی
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
46
کپی درخت دودوییدرخت پيمايش پس ترتيب مي توانيم الگوريتم •
دودويي را اندکي تغيير دهيم تا براي کپي درخت به کار رود.
برابرای دو درخت•ترتیب و ساختار گره ها یکسان•داده های گره ها یکسان•
47
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
محاسبه عبارات گزاره اي x1 (x2 ¬x3)
• x1 and x3 =false, x2 = true
• false (true ¬false) = false true = true
پيمايش پس ترتيب:•براي ارزيابي هر گره بايد قبال آرگومان هاي آ ن را •
محاسبه کرده باشيم.
48
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
محاسبه عبارات گزاره اي
49
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
(x1 ¬x2) (¬ x1 x3) ¬x3
X3X1
X2 X1
X3
data
value
درخت نخی دودویی
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
50
درخت نخینخ کشي کردن•
عيب درختهاي دودويي باال: تعداد زيادي از •است NULLاشاره گرها
nتعداد گره
n-1تعداد اشاره گر غير صفر
2nتعداد کل اشاره گر ها
n+1تعداد اشاره گر صفر
راهکار: از اشاره گرهاي تهی براي اشاره به •گره هاي ديگر درخت استفاده کنيم. به چنين
گويند. نخاشاره گرهايي 51
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
درخت دودويي نخ كشي شده(Threaded)از اشاره گرهاي خالي براي اشاره به عنصر قبل •
استفاده مي شود. inorderو عنصر بعد در ترتيب
52
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
A
B C
GE
I
D
H
F
root
inorder traversal:H, D, I, B, E, A, F, C, G
dangling
dangling
ساختمان داده براي گره هاي درخت نخ كشي شده
53
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
TRUE FALSE
left_thread left_child data right_child right_thread
FALSE: childTRUE: thread
درخت نخ كشي شده: مثال
54
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
f f--
f fA
f fCf fB
t tE t tF t tGf fD
t tIt tH
root
پيمايش ميان ترتيببا استفاده از نخ کشيها مي توان پيمايش ميان •
ترتيب را بدون استفاده از پشته انجام داد.باشد آنگاه عضو بعد ptr.right_thread = TRUE- اگر 1
ptr . right_childدر روش ميان ترتيب ptrازاست.
در روش ptr- در غير اينصورت عضو بعد از 2مسيري از اشاره ميان ترتيب با دنبال کردن
به دست ptrگرهاي بچه چپ از بچه راست برسيم. left_thread = TRUEمي ايد تا به گره اي با
55
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
(Successorپيدا کردن عضو بعدي )
56
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
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
پيمايش ميان ترتيب
57
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
void tinorder(threaded_pointer tree){threaded_pointer temp = tree;for (;;) {
temp = insucc(temp);if (temp==tree)
break;printf(temp.data);
}}
اضافه کردن گره
يک راستبچه اضافه کردن يک گره به عنوان •والد گره
58
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
X
A
B
root
child
parent A
B childparent
D
E Fحالت اول:
Bزير درخت راست خالي باشد حالت دوم:
زير درخت راست Bخالي نباشد
X
اضافه کردن گره
59
نقا
ه د
نسی
حی
سدهن
مو
ی فن
ه دکش
اند
م
ج
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;parent.right_thread = FALSE;If(!child.right_thread){
temp = insucc(child);temp.left_child = child;
}}
X
A
B
root
child
parent
A
B childparent
D
E Fsuccessor
temp
حالت دومحالت اول
X