Transcript
Page 1: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

:مدرسفرشید شیرافکن

دانشگاه تهران دانشجوی دکتری (بیو انفورماتیک: دکتری( )کامپیوتر نرم افزار: کارشناسی و کارشناسی ارشد )

(قسمت اول)فصل ششم

درخت

1

فرادرس

FaraDars.org

Page 2: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

دسته بندی ساختمان داده ها

2

پیوندیلیست-پشته-صف-آرایه:خطی-1

گراف-درخت:خطیغیر-2

فرادرس

FaraDars.org

Page 3: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

تعاریف اولیه

3

یمتقسمجزامجموعهبهگره‌هابقیهواستریشهنامبهخاصیگرهدارایکهباشدمیگرهچندیایكازمحدودیمجموعهدرخت.باشندمیدرختیكنیزخودمجموعه‌هاازیكهرکهمی‌شوند

.‌‌گره‌ای‌که‌دارای‌پدر‌نیستریشه

(رگره‌با‌درجه‌صف)گره‌بدون‌فرزند‌برگ

گره‌غیر‌برگ‌و‌ریشهگره داخلی

گره‌هایی‌با‌یك‌پدربرادر

فرادرس

FaraDars.org

Page 4: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

ارتفاع درخت و ارتفاع گره

4

رگ‌باز‌آن‌گره‌به‌طول‌بزرگترین‌مسیر‌گرهارتفاع

ارتفاع‌ریشهارتفاع درخت

فرادرسآن‌گرهبه‌طول‌مسیری‌از‌ریشه‌گره (سطح)عمق

FaraDars.org

Page 5: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

.درخت حلقه ندارد

.شکل‌زیر‌درخت‌نیست

5

فرادرس

FaraDars.org

Page 6: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

درخت دودویی

.باشد(‌فرزند‌چپ‌و‌راست)دارای‌دو‌فرزند‌حداکثرمرتبی‌که‌هر‌عنصر‌آن‌درخت‌:‌درخت‌دودویی•

‌درخت‌مرتب• .که‌ترتیب‌فرزندان‌هر‌گره‌مشخص‌استدرختی‌:

6

فرادرس

FaraDars.org

Page 7: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

درخت دودویی پر

.استفرزنددودارایبرگ‌هاازغیربهگرههرآندرکهدرختی:پردودوییدرخت

:4گره‌و‌ارتفاع‌31یك‌درخت‌دودویی‌پر‌با‌:‌‌مثال

n:گرهتعداد2h:برگ‌هاتعداد = 2h+1 – floor:داخلیگره‌هایتعداد1 (n/2)

7

فرادرس

FaraDars.org

Page 8: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

درخت دودویی کامل

.ندمی‌گیرقراردرختچپدراستممکنکهجاییتاگره‌هاهمۀوشده‌است،پرکاملبه‌طور،سطحآخریناحتماالًجزبهسطح،هر

8

فرادرس

FaraDars.org

Page 9: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

هاتعداد برگ

:تایی‌kتعداد‌برگها‌در‌یك‌درخت‌

:تایی‌3درخت‌:‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌تایی‌2درخت‌

9

1...)2()1( 210 nnknkn kk

120 nn

3,2 02 nn11,8,1 023 nnn

12 230 nnn فرادرس

FaraDars.org

Page 10: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

شماره گذاری

:استبرقرارزیرقواعدiاندیسباگرههربرایشده،گذاریشمارهکاملدودوییدرختهردر.استریشهآنگاهباشد،i=1اگر(1

>iاگر(2 .استi/2پایینحددر،آنوالدآنگاهباشد،1<

.است2iدرآن،چپفرزندآنگاهباشد،2i<=nاگر(3

.است2i+1درآن،راستفرزندآنگاهباشد،2i+1<=nاگر(4

10

فرادرس

FaraDars.org

Page 11: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

پیاده سازی درخت دودویی

.یا‌لیست‌پیوندی‌نمایش‌دادیك‌درخت‌را‌می‌توان‌به‌کمك‌آرایه‌

آرایهپیاده سازی با .‌‌ام‌در‌آرایه‌ذخیره‌می‌شودiدر‌خانه‌شده،‌‌ام‌با‌توجه‌به‌درخت‌دودویی‌کامل‌شماره‌گذاری‌iگره‌

11

فرادرس

FaraDars.org

Page 12: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

:پیاده‌سازی‌درخت‌اریب‌با‌آرایه‌

12

3115731

5040302010

فرادرس

FaraDars.org

Page 13: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

پیوندیپیاده سازی با لیست

.باشدمی"راستفرزندبهگراشارهوچپفرزندبهگراشارهداده،"قسمتسهشاملدودوییدرختدرگرههر

:cزباندردودوییدرختگرهیكتعریف

struct node{

int data;

struct node* left;

struct node* right;

};

13

فرادرس

FaraDars.org

Page 14: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

14

فرادرس

FaraDars.org

Page 15: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

پیمایش درخت دودویی

15

.یکباردقیقاآنهایگرههمهمالقاتودرختیالهایرویحرکتیعنیدرخت،‌پیمایش

:پیمایشمعمولروشهای(preorder)(راستـچپـریشه)(VLR)پیشوندی(1

(inorder)(راستـریشهـچپ)(LVR)میانوندی(2

(postorder)(ریشهـراستـچپ)(LRV)پسوندی(3

زیرنهایتدر.شودمیپیمایشپیشوندیروشبهچپسمتدرختزیرسپس.شودمیمالقاتریشهابتدا،پیشوندیپیمایشدر.شودمیپیمایشپیشوندیروشبهراستسمتدرخت

فرادرس

FaraDars.org

Page 16: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

Preorder : J E A H T M Y

Inorder : A E H J M T Y

Postorder : A H E M Y T J

16

فرادرس

FaraDars.org

Page 17: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

Preorder : Y T W Z

Inorder : T W Y Z

Postorder : W T Z Y

17

فرادرس

FaraDars.org

Page 18: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

Preorder : S R Y T W Z

Inorder : R S T W Y Z

Postorder : R W T Z Y S

18

فرادرس

FaraDars.org

Page 19: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

Preorder : P F B H G S R Y T W Z

Inorder : B F G H P R S T W Y Z

Postorder : B G H F R W T Z Y S P

19

فرادرس

FaraDars.org

Page 20: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

Preorder : 8 5 3 4 2 6 1 9

Inorder : 3 4 5 8 6 2 1 9

Postorder : 4 3 5 6 9 1 2 8

20

فرادرس

FaraDars.org

Page 21: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

21

فرادرس

FaraDars.org

Page 22: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

الگوریتم های پیمایش

postorderinorderpreorder

post(p){if (p==null) return;post ( p -> left );post ( p -> right );cout<<p -> data;

}

in (p){if (p==null) return;in ( p -> left );cout<<p -> data;in ( p -> right );

}

pre (p){if (p==null) return;cout<< p -> data;pre ( p -> left );pre ( p -> right );

}

22

فرادرس

FaraDars.org

Page 23: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

میانوندیرسم درخت دودویی با داشتن پیمایش های پیشوندی و

:زیرپیمایشدوداشتنبادودوییدرخترسم

Preorder : a b d f c e g

Inorder : d f b a e g c

23

فرادرس

FaraDars.org

Page 24: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مشخص کردن گره های تک فرزندی

.کردمشخصرافرزندیتكهایگرهدودویی،درختیكpostorderوpreorderپیمایشدوکمكبهتوانمی

postorderپیمایشدرآنمعکوسکهسرهمیپشتزوجوکردهحرکتراستبهچپازPreorderپیمایشدرکاراینبرای.باشندمیفرزندیتكهایگرهها،زوجایندرگرهاولین.کنیممیپیداراباشد

:مثال

Preorder : 8 5 3 4 2 6 1 9

Postorder : 4 3 5 6 9 1 2 8

(53) , (34) و (19) .

24

فرادرس

FaraDars.org

Page 25: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

دودویی با داشتن پیمایش های پیشوندی و پسوندیرسم درخت

.کردمشخصنمی‌توانرافرزندیتكگره‌هایمحلباشند،دسترسدردودوییدرختیكپسوندیوپیشوندیهایپیمایشاگر

آنهاpostorderوpreorderپیمایشکهکردایجادتوانمیدرختچندینفرزندی،تكهایگرهوجودصورتدربنابراین(فرزندیتكهایگرهتعداد:k)،k2^:بااستبرابرهادرختاینتعداد.باشندبرابرهمبا

:مثال

Preorder : A B C D E F G H I

Postorder : C E D B H I G F A

:ممکندرختچهار

25

فرادرس

FaraDars.org

Page 26: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

(Level Order)سطحدرخت به ترتیب پیمایش

.کنیممیمالقاتراستبهچپازسطحهردروپایینبهباالازسطحترتیببهراهاگره

levelپیمایشدر oderشودمیاستفادهصفزا..دارندنیازپشتهبهپسوندی،وپیشوندیمیانوندی،هایپیمایش

26

فرادرس

FaraDars.org

Page 27: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

عبارتدرخت

.رودمهم‌درخت‌دودویی‌است‌که‌برای‌عبارت‌های‌ریاضی‌به‌کار‌می‌کاربردهای‌درخت‌عبارت‌از‌

‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌‌آن‌را‌تولید‌می‌کندinfixیك‌درخت‌عبارت،‌‌نگارش‌‌inorderپیمایش‌ .A-(C/5*2)+(D*5%4)

.آن‌را‌تولید‌می‌کندprefixیك‌درخت‌عبارت،‌‌نگارش‌‌preorderپیمایش‌.آن‌را‌تولید‌می‌کندpostfixیك‌درخت‌عبارت،‌‌نگارش‌‌postorderپیمایش‌

27

فرادرس

FaraDars.org

Page 28: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

گره ساختnدودویی که می توان با تعداد درخت های

.ایمکردهگذاریشمارهnتا1ازinorderروشبهراهاگرهازیكهرمی‌کنیمفرض

.دارندقرارریشهراستدرختزیردرگرهn-iوریشهچپدرختزیردرگرهi-1صورتآندرباشد،ریشهiشمارهگرهاگر

1 2 3 …………………i-1 i i+1 ……………………. n

28

n

n

nbn

2

1

1

1,1 10

1

1

bb

bbb in

n

i

in

فرادرس

FaraDars.org

Page 29: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

.نماییدمشخصراساختمی‌توانگره3باکهمتفاوتدودوییهایدرختتعداد:پاسخ

:کنیممیایجادرازیرهایحالتودادهقرارریشهرایکیریشهراستدرگرهدوهر-الف

ریشهراستدرگرهیكوریشهچپدرگرهیك-بریشهچپدرگرهدوهر-ج

:دومروش

29

54

45

4

!3!3

!3456

4

!3!3

!6

4

3

6

21101102 bbbbb فرادرس

FaraDars.org

Page 30: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402 نخ کشی شده دودویی درخت(( A Threaded Binary Tree

.استاشاره‌گر2nدارایگرهnبادودوییدرختیك

n-1وشدهاستفادهاشاره‌گرn+1استنشدهاستفادهاشاره‌گر.پیمایشسرعتنرفتباالباعثکهکرداشارهپیمایشیكدربعدییاقبلیعناصربهمی‌تواناستفادهبدوناشاره‌گرهایازاستفادهبا

.می‌شوددرخت

.می‌گویندنخیدرخت،شوداستفادهچنیناینآناستفادهبدوناشاره‌گرهایازکهدرختیبه

H D I B E A F C G

30

فرادرس

FaraDars.org

Page 31: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

ساختار گره در درخت نخی

struct node{

struct node *left ;

struct node *right ;

char data ;

short int lflag ;

short int rflag ;

};

.‌‌یك‌اشاره‌گر‌نخی‌است‌و‌در‌غیر‌این‌صورت‌اشاره‌گر‌عادی‌به‌فرزند‌چپ‌استleftباشد،‌lflag=1اگر‌

.‌‌یك‌اشاره‌گر‌نخی‌است‌و‌در‌غیر‌این‌صورت‌اشاره‌گر‌عادی‌به‌فرزند‌راست‌استrightباشد،‌rflag=1اگر‌

31

فرادرس

FaraDars.org

Page 32: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

(عمومی)کلی درخت

ایزمتمهمازراستیاچپبچهعنوانبادودوییدرختیكدرفرزنداینآنگاهباشد،فرزندیكدارایگرهیكاینکهفرضبا.نداردوجودآنهابینتفاوتیکلیدرختیكدرامامی‌شوند،

درختبا"معادلدودوییدرخت"آنبهکهآوریممیدردودوییدرختیكصورتبهراآنهاکلی،هایدرختسازیپیادهبرای.گوییممیاصلی

32

فرادرس

FaraDars.org

Page 33: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مراحل تبدیل یک درخت به درخت دودویی معادل

.می‌کنیممتصلیکدیگربهرا(پدریكفرزندان)همکنارگره‌هایکلیهسطحهردر-1.می‌کنیمقطعرافرزندچپ‌ترینسمتاتصالبجزپدر،گرهبهگره‌هااتصاالتکلیه-2

درگرههرراستسمتبرادرواستمعادلدودوییدرختدرگرهآنچپفرزنداصلی، درختدرگرههرفرزنداولین.استمعادلدرختدرآن،راست فرزنداصلی،درخت

33

فرادرس

FaraDars.org

Page 34: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

(Forest)جنگل

34

‌درخت‌مجزا‌استnجنگل‌شامل‌ .(n>=0)

فرادرس

FaraDars.org

Page 35: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

تبدیل جنگل به درخت دودویی

35

:تبدیلمراحل.می‌کنیمتبدیلدودوییدرختیكبهراجنگلدرختهر-1.کنیممی‌متصلهمبهریشه،گره‌هایراستفرزندطریقازرادودوییهایدرخت-2

.انددادهتشکیلراجنگلکهاستهاییدرختتعدادبرابرها،برگتعدادجنگل،ازحاصلدودوییدرختدر

فرادرس

FaraDars.org

Page 36: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

(Tree-2)درخت دودویی گسترش یافته

.داردفرزند2یا0گرههرآندرکهدودوییدرخت.گویندمیخارجیراندارندفرزندکههاییگره

.گویندمیداخلیرادارندفرزند2کهگره‌هایی.دهیممینشانIباراداخلیگره‌هایتعداد

.دهیممینشانEباراخارجیگره‌هایتعداد

.نامیممیLIداخلیمسیرطولراداخلیگرههرتاریشهازهاطولتماممجموع

.نامیممیLEخارجیمسیرطولراخارجیگرههرتاریشهازهاطولتماممجموع

36

5221 EL

I2LL IE

3

2

E

I

110 ILفرادرس

FaraDars.org

Page 37: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

پیاده‌سازی‌چند‌الگوریتم‌

cبه‌زبان‌

37

فرادرس

FaraDars.org

Page 38: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

نودایجاد

:‌‌ساختار‌گره‌یك‌درخت‌دودویی‌struct node{ int data; struct node* left; struct node* right; };

:هاسازیپیادهتمامدرشدهاستفادهnewnodeتابع

struct node* newnode(int item){

struct node* node = (struct node*) malloc(sizeof(struct node));

node ->data = item;

node ->left = NULL;

node ->right = NULL;

return(node);

}

38

فرادرس

FaraDars.org

Page 39: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402شمارش‌تعداد‌گره‌ها

unsigned int count (struct node* root)

{

if (root == NULL)

return (0);

return (1 + count ( root->left ) + count ( root->right ) );

}

39

فرادرس

FaraDars.org

Page 40: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

تشخیص برگ بودن

bool isleaf (struct node *n)

{

if (n== NULL)

return false;

if ((n ->left == NULL) && (n ->right == NULL) )

return true;

return false;

}40

فرادرس

FaraDars.org

Page 41: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

ساختن درخت

int main(void) {

struct node* nr = NULL;

struct node* root = newnode (2);

root ->left = newnode (7);

root -> right = newnode (5);

root -> left -> right = newnode (6);

root -> left -> right -> left = newnode (1);

root -> right -> right = newnode (9);

}

41

فرادرس

FaraDars.org

Page 42: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

کامل بودن درخت دودوییتشخیص

bool f(struct Node* root, unsigned int i , unsigned int n)

{

if (root == NULL)

return (true);

if (i >= n)

return (false);

return( f(root->left, 2*i , n) && f (root->right , 2*i + 1 , n) );

}

42

فرادرس

FaraDars.org

Page 43: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

حذف گره های تک فرزندی

حذف گره های تک فرزندیstruct node* remove (struct node* root){

if (root==NULL) return NULL;

root->left = remove (root->left);

root->right = remove (root->right);

if ((root->left==NULL) && (root->right==NULL) ) return root;

if (root->left==NULL)

{ struct node* n = root->right; free(root); return n; }

if (root->right==NULL)

{ struct node* n = root->left; free(root); return n; }

return root;

}

43

فرادرس

FaraDars.org

Page 44: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

levelorderپیمایش

void LevelOrder( struct node* root ){

int rear, front;

struct node ** queue = createQueue( &front , &rear );

struct node * t = root;

while(t) {

cout << t ->data ;

if (t ->left ) enQueue( queue, &rear, t -> left );

if (t ->right ) enQueue (queue, &rear, t -> right );

t = deQueue (queue, &front );

}

}44

فرادرس

FaraDars.org

Page 45: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

struct node** createQueue(int *front , int *rear) {struct node ** queue = (struct node **) malloc (sizeof(struct node*) * MAX);

*front = *rear = 0;

return queue;

}

void enQueue(struct node **queue, int *rear, struct node *newnode) {

queue[*rear] = newnode;

(*rear)++;

}

struct node * deQueue(struct node **queue, int *front) {

(*front)++;

return queue[*front - 1];

}45

فرادرس

FaraDars.org

Page 46: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402تمرین

عملکرد‌تابع‌زیر‌چیست؟

int sum ( node *root ){

int s = 0;

if ( root != NULL ) {

if ( isLeaf (root ->left ) ) s = s + root ->left ->data;

else s = s+ sum (root ->left);

s = s + sum (root -> right);

}

return s;

}

46

فرادرس

FaraDars.org

Page 47: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

درخت جستجوی دودویی

47

فرادرس

FaraDars.org

Page 48: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

(BST)درخت جستجوی دودویی

Binary))دودوییجستجویرادرختی Search Treeکهنامندمی:.باشندریشهازترکوچكچپ،درختزیرعناصر-1

.باشندریشهازبزرگ‌ترراست،درختزیرعناصر-2

.‌باشنددودوییجستجویدرختان،راستوچپدرختانزیر-3

.باشدنداشتهتکراریعنصرباگره-4

48

فرادرس

FaraDars.org

Page 49: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

BSTارتفاع

.باشدمیnبرابرحالتبدتریندروlgnبرابرمتوسططوربهدودوییجستجویدرختارتفاع

49

nhn lg فرادرس

FaraDars.org

Page 50: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

BSTساخت

با‌سه‌گره‌ساخت؟‌BSTتهی،‌یك‌BSTبه‌هر‌ترتیب‌دلخواه‌در‌یك‌3,2,1به‌چند‌حالت‌می‌توان‌با‌وارد‌کردن‌مقادیر‌:پاسخ:عددسهورودبرایممکنهایترتیب

123 , 132 , 321 , 312 , 231 , 213

.‌‌درخت‌متمایز‌می‌توان‌ایجاد‌کرد5بنابراین‌.‌منجر‌به‌یك‌درخت‌می‌شوند231و213ترتیب‌.‌‌رسید5جواب‌به‌در‌رابطه‌3می‌توان‌با‌قرار‌دادن‌مقدار‌البته‌

50

فرادرس

FaraDars.org

Page 51: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

BSTجستجوی یک عنصر در

:می‌شودمقایسهریشهبانظرموردعنصرکلیدمقدار.رسیده‌ایمنتیجهبهباشدبرابراگر-1

.نماییممیجستجوبازگشتیصورتبهراچپدرختزیرباشد،ریشهمقدارازکمتراگر-2

.نماییممیجستجوبازگشتیصورتبهراراستدرختزیرباشد،ریشهمقدارازبزرگتراگر-3

51

فرادرس

FaraDars.org

Page 52: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

.تعداد‌مقایسه‌برای‌پیدا‌کردن‌هر‌یك‌از‌کلیدهای‌درخت‌زیر‌را‌تعیین‌کنید:‌مثال

52

18

24

212

32

36

310

314

فرادرس

FaraDars.org

Page 53: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

الگوریتم جستجوی دودویی

search( t , key)

{

if ( t==NULL or key == t -> data )

return t ;

if ( key < t -> data )

return search ( t -> left , key ) ;

else

return search ( t -> right , key ) ;

}

53

فرادرس

FaraDars.org

Page 54: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

جستجودنباله

x(ناموفقیا)موفقیافتندرکهاستدرختآنهایگرههایبرچسبازایدنباله،"xکلیدجستجویدنباله"یكBSTیكدر.شوندمیمالقات

>:بااستبرابر45جستجودنباله:مثال 60 , 25 , 50 , 30 , 45 >

54

فرادرس

FaraDars.org

Page 55: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

BSTدرج یک عنصر به

راستدرخترزیبهبودنبزرگترصورتدروچپدرختزیربهبودن،کوچکترصورتدروشدهمقایسهریشهباابتدانظرموردکلید.شودمیاضافه

:45کردناضافه:مثال

.می‌گیردانجام‌O(h)در‌زمانhبه‌ارتفاع‌گره‌و‌nبا‌BSTدر‌درج‌

55

فرادرس

FaraDars.org

Page 56: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

BSTالگوریتم درج در

tدر درخت جستجوی دودویی itemدرج یک گره با داده

insert( t , item ) {

p = search( t , item );

if ( p or !t ) {

n = malloc(sizeof(t));

n -> data = item ; n -> left = NULL; n -> right = NULL;

if ( t )

if (item < p -> data ) p -> left = n; else p -> right = n;

else

t = n;

}

}

56

فرادرس

FaraDars.org

Page 57: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

سازیمرتب

رااعدادازشدهمرتبلیستیكتوانمیدرخت،inorderپیمایشسپسوعددnبادودوییجستجویدرختیكایجادباTreeسازی،مرتبروشاینبه.آوردبدست Sortگویندمی.

inorder : 20 , 25 , 30 , 45 , 50 , 60 , 65 , 70

57

فرادرس

FaraDars.org

Page 58: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

BSTحذف یک گره از

:دهدرخاستممکنزیرحالتسهازیکی،حذفبراینظرموردگرهیافتنازپس.نمی‌باشددرختتنظیمبهنیازیوشدهحذفسادگیبهباشد،فرزندفاقدگرهاگر-1

.می‌شودمنتقلدرختدرباالطرفبهآنفرزندباشد،فرزندیكدارایفقطگرهاگر-2

.می‌گیردراآنجایinorderپیمایشدرآنقبلییابعدیگرهباشد،فرزنددودارایگرهاگر-3(.می‌شودجایگزینراستدرختزیرعنصرکوچکترینیاچپدرختزیرعنصربزرگ‌ترینمقدارباشده،حذفعنصرعبارتیبه)

58

فرادرس

FaraDars.org

Page 59: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

مثال

:‌25با‌داده‌حذف‌گره‌•

59

فرادرس

FaraDars.org

Page 60: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

BSTپیدا کردن عنصر مینیم و ماکزیمم در

.کردپیداNULLبهرسیدنتاریشهازچپفرزندانگرهایاشارهکردندنبالباتوانمیرااستمینیمم،BSTدرآنکلیدکهعنصری

min( t ) {

while ( t -> left != NULL )

t = t -> left;

return t;

}

:را‌برمی‌گرداندtزیر‌درخت‌مشتق‌شده‌از‌ماکزیمم‌در‌روال‌زیر‌اشاره‌گری‌به‌عنصر‌

max( t ) {

while ( t -> right != NULL )

t = t -> right;

return t;

}

60

فرادرس

FaraDars.org

Page 61: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

درخت هیپ

61

فرادرس

FaraDars.org

Page 62: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402 هرم(Heap)

:داردوجوددودوییHeapنوعدو

1-Max-Heap:.باشدفرزندانشکلیدهایمقدارمساوییابزرگترآنگرههرکلیدمقدارکهکاملدودوییدرختیك

.کلیدبزرگترین:ریشه

62

فرادرس

FaraDars.org

Page 63: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402 هرم((Heap

2-Min-Heap:.باشدفرزندانشکلیدهایمقدارمساوییاکوچکترآنگرههرکلیدمقدارکهکاملدودوییدرختیك

.کلیدکوچکترین:Minheapریشه

63

فرادرس

FaraDars.org

Page 64: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

با آرایهheapنمایش

:v[i]عنصرهربرای:پدرv[2i+2]:راستفرزندv[2i+1]:چپفرزند

64

فرادرس

FaraDars.org

Page 65: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heapدرج در

(خالیجای‌ترینچپدر)نشدهپرکاملطوربههنوزکهسطحیدردرج

(.می‌شودجابهجاپدرشگرهباامکانحدتاسطحپایین‌تریندرگرهیعنی)،می‌پذیردصورتReHeapعملسپس

:5درج:مثال

65

فرادرس

FaraDars.org

Page 66: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heaps 66

19

4222127

23

45

35

42

درج

فرادرس

FaraDars.org

Page 67: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heaps 67

19

4222142

23

45

35

27

درج

فرادرس

FaraDars.org

Page 68: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heaps 68

19

4222135

23

45

42

27

درج

فرادرس

FaraDars.org

Page 69: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

ساخت درخت هیپ

69

فرادرس

FaraDars.org

Page 70: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heapحذف از

.دمی‌شوتنظیممجدداًدرختومی‌گیردقرارریشهدرسطح،پایین‌تریندرموجودعنصرراست‌ترینسمتوشدهحذفریشه

70

فرادرس

FaraDars.org

Page 71: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heaps 71

19

4222127

36

45

35

3

حذف:‌مثال‌

فرادرس

FaraDars.org

Page 72: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heaps 72

19

4222127

36

3

35

حذف:‌مثال‌

فرادرس

FaraDars.org

Page 73: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heaps 73

19

4222127

3

36

35

حذف:‌مثال‌

فرادرس

FaraDars.org

Page 74: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Heaps 74

19

432127

22

23

35

حذف:‌مثال‌

فرادرس

FaraDars.org

Page 75: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402 صف اولویت(Priority Queue)

.می‌شودمشخصاولویتیدادههربرایاولویت‌صفدر

.می‌گرددحذفدارد،رااولویتباالترینکهعنصری

.داردرسیدگیبرایبیشتریاولویتبیشتربیماریشدتبابیمارهرکهکردتشبیهبیمارستانیكاورژانسبهمی‌توانرااولویتصف.می‌کنداستفادهاولویتهایصفازپردازش‌هامدیریتبرایهمکامپیوترسیستم‌عامل

:داردوجوداولویتصفنوعدو

max-priority)ماکزیمماولویتصف-1 queue)

min-priority)مینیمماولویتصف-2 queue)

75

فرادرس

FaraDars.org

Page 76: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

پیاده سازی صف اولویت

نامرتبآرایهازاستفادهبا-1.می‌گیردقرارآنانتهایدرعادیصفمانندمی‌شود،صفواردکهداده‌ایO(n):حذفO(1):درج

مرتبآرایهازاستفادهبا-2.می‌گیردقرارمناسبمحلدرخوداولویتاساسبرمی‌شود،صفواردکهداده‌ایO(1):حذفO(n):درج

((heapمرتبنیمهآرایهازاستفادهبا-3O(logn):حذفO(logn):درج

.داردبهتریبسیارکارآییاولویتصفسازیپیادهبرایهیپدرختروشپس

76

فرادرس

FaraDars.org

Page 77: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

.(ادامه)اولویت صف

:کندمیپشتیبانیرازیراعمالماکزیمماولویتصفیك

ناصرعتمامبایدونداردثابتیجایخاصعنصریكچونداد،انجامکاراصورتبهتواننمیرااولویتصفدرعنصریكیافتن.شوندجستجو

77

MAXIMUM(S) اولویتبرگرداندن عنصر با بزرگترینO(1)

INSERT(S,x) درج عنصرxO(lgn)

EXTRACT-MAX(S) لویتاوحذف و برگرداندن عنصر با بزرگترینO(lgn)

INCREASE-KEY(S,x,k) اولویت عنصر افزایش مقدارx به مقدار جدیدkO(lgn)

فرادرس

FaraDars.org

Page 78: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

(Min-Max Heap) حداکثر -هرم حداقل

78

.استکلیدنامبهفیلدیدارایآنعنصرهرنباشد،‌تهیاگرکهاستکاملدودوییدرختیك

.داردقرارminسطحدرریشه.هستندmaxسطوحوminسطوحبترتیبدرخت،اینمتناوبسطوح.استگرهاینریشهبادرختزیردرواقععناصرهمهمیاندرکلیدکمتریندارایآندرواقععنصرکهحداقل،‌سطحدرگره‌ای:minگره‌.استگرهاینریشهبادرختزیردرواقععناصرهمهمیاندرکلیدبیشتریندارایآندرواقععنصرکهحداکثر،‌سطحدرگره‌ای:maxگره‌ فرادرس

FaraDars.org

Page 79: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

حداکثر-درج در هرم حداقل

:‌‌80درج‌گره‌

79

فرادرس

FaraDars.org

Page 80: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

حداکثر-درج در هرم حداقل

:‌5درج‌گره‌

80

فرادرس

FaraDars.org

Page 81: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

حذف

:7حذف •

81

فرادرس

FaraDars.org

Page 82: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Deap

:استزیرخواصداراییاواستتهییاکهاستکاملدودوییدرختیك

.نداردوجودعنصریریشهدر-1

.استminheapیكچپسمتدرختزیر-2.استmaxheapیكراستسمتدرختزیر-3کلیدمساوییاکوچکترچپ،درختزیرگرهکلید-4

.باشدمیراستدرختزیردرمتناظرگره

‌‌ارتفاع• :O(lgn)

O(lgn):‌یا‌درج‌حذف‌•

.می‌باشدn-1قرار‌نمی‌دهیم‌و‌تعداد‌عناصر‌آرایه‌برابر‌چیزی‌در‌خانه‌اول‌.‌را‌می‌توان‌در‌یك‌آرایه‌ذخیره‌کردdeapیك‌•

82

فرادرس

FaraDars.org

Page 83: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

deapگره متناظر در

.است،maxheapدرآنبامتناظرگرهآنگاهباشد،minheapدرگرهیiاگر

.‌‌خواهد‌بودj/2،‌گره‌iبیشتر‌شود،‌‌آنگاه‌گره‌متناظر‌با‌گره‌nاز‌jالبته‌اگر‌

83

1log22

i

ij

فرادرس

FaraDars.org

Page 84: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Deapدرج در

:‌‌4درج‌عنصری‌با‌کلید‌

84

فرادرس

FaraDars.org

Page 85: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

Treap

.شودمیساختهHEAPوBSTهایویژگیترکیباز

.استاولویتوکلیددارایگرههر

.کنندمیپیرویBSTویژگیازکلیدها

.کنندمیپیرویMinHeapویژگیازهااولویت

lognمرتبهاز:جستجو

85

فرادرس

FaraDars.org

Page 86: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402درج‌در‌treap

86

فرادرس

FaraDars.org

Page 87: آموزش ساختمان داده ها - بخش ششم

ساختمان داده ها

faradars.org/fvds9402

87

این اسالید ها بر مبنای نکات مطرح شده در فرادرس« مجموعه فرادرس های ساختمان داده ها»

.تهیه شده است

.نماییدلینک زیر مراجعه برای کسب اطالعات بیشتر در مورد این آموزش به

faradars.org/fvds9402

فرادرس

FaraDars.org