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