فصل پنجم : درخت

Preview:

DESCRIPTION

فصل پنجم : درخت. آشنايي با درخت درخت هاي دودويي پيمايش درختان هرم جنگل. اهداف. فصل پنجم : درختان. درخت. ساختار درختي يعني مجموعه داده هاي سازماندهي شده اي که عناصر اطلاعاتي شان به وسيله انشعاباتي با هم رابطه داشته باشند. مفهوم درخت. - PowerPoint PPT Presentation

Citation preview

آشنايي با درختدرخت هاي دودوييپيمايش درختانهرمجنگل

اهداف

1

ه��اي داده مجموع��ه يع��ني درخ��تي ساختار س�ازماندهي ش�ده اي ک�ه عناص�ر اطالع�اتي ش�ان ب�ه وس�يله انش�عاباتي ب�ا هم رابط�ه داش�ته باش�ند.

درخت

2

ب�ه ي�ا چن�د گ�ره از ي�ک درخت مجموع�ه مح�دودي صورت زير مي باشد :

داراي گره خاصي به نام ريشه باشد.

مجموع�ه مج�زا n ≥ 0 بقي�ه گ�ره ه�ا ب�ه تقس�يم ش�ده ک�ه ه�ر ي�ک از اين مجموع�ه ه�ا

هس�تند. درخت ي�ک درخت�ان خ�ود زي�ر ريشه ناميده مي شوند.

nTT ,....1

nTT ,....1

3

،گرهبه عنصر حاوي اطالعات و انشعابات به ديگر عناصر اطالق مي شود.

،آن ناميده ميشوددرجهتعداد زير درختهاي يك گره ،ناميده گره پاياني يا برگگره اي كه درجه آن صفر باشد

ناميده گره هاي غيرپايانيميشود و در مقابل بقيه گره ها ميشوند.

و به گره هاي گره پدر)والد(گره ريشه را در هر زير درخت ميگويندگره فرزندمتصل شده به آن

ناميده برادر )يا همزاد(فرزنداني كه پدر يكسان دارند ميشوند

4

A وال�د B ، C، D . اس�ت B ، C، D همزادند.

A

C

G

DB

E H I J

M

F

ريشه درخت

LK

همزاد

A = 3درجه 5-1شکل

5

اجداد يک گره ، گره هايي هستند که در مسير طي اجداد گره : اجداد گره : شده از ريشه تا آن گره وجود دارند.

سطح يک گره بدين صورت تعريف مي شود که سطح گره : سطح گره : ريشه در سطح يک قرار مي گيرد. براي تمامي گره هاي بعدي

، سطح گره برابر است با سطح والد به اضافه يک .

ارتفاع يا عمق يک درخت به بيشترين سطح ارتفاع درخت : ارتفاع درخت : گره هاي آن درخت گفته مي شود.

6

ليس�ت از اس�تفاده ، درخت نم�ايش راه يک است .

را مي ت�وان ب�ه ص�ورت زي�ر نش�ان داد : 5-1شکل

(A(B(E(K ،L)،F)،C(G)،D(H(M)،I،J)))A

C

G

DB

E H I J

M

F

LK

7

اگر بخواهيم براي نگهداري يك درخت ساختمان داده اي مانندنمايش معمول )هر گره آدرس گره هاي فرزند خود را داشته

باشد( تعريف كنيم مشكل زير بوجود مي آيد: درجه تمام درختها يكي نميباشد لذا مجبور خواهيم شد براي هر

گره تعداد متغيري از اشاره گرها داشته باشيم. با اين وجود، نوشتن الگوريتم براي گره هايي كه طول متغير دارند دشوار

خواهد شد.براي حل مشكل بايد از گره هايي با طول ثابت استفاده كنيم

8

data link 1 link 2 … Link k

اگر بيشترين درجه درختk باشد بنابراين هر گره اشاره گر را داشته باشد و kبايد توانايي نگهداري

ساختمان داده اي به شكل زير بايد تعريف كنيم.

9

اگرT درختي از درجه k با n گره باشد و هر گره آن مانند شكل قبل

فيلد بچه آن )اشاره nk از n)k-1(+1طول ثابتي داشته باشد آنگاه

است.(NULL) 0گرهاي به فرزند( برابر

:اثبات

از آنجا كه هر فيلد بچه غير صفر به يك گره اشاره ميكند و براي هر

گره غير از ريشه يك اشاره گر وجود دارد از اينرو تعداد فيلدهاي بچه

i برابر nغيرصفر براي درختي با است. تعداد كل n-1 گره دقيقا

ميباشد. لذا:nk برابر k گره از درجه nفيلدهاي بچه براي درختي با

تعداد اشاره گرهاي بچهNULL : nk-)n-1(=n)k-1(+1

10

براي درختان دو نمايش خاص كه از گره هايي با طول ثابتاستفاده ميكند ارائه ميكنيم.

الف( نمايش درخت بصورت بچه چپ-همزاد راست 2ب( نمايش درخت بصورت يك درخت درجه.

11

براي نمايش درختان دودويي ، دقيقا نياز به دو اتصال يا اشاره گربه ازاي هر گره است.

Data

left child right sibling

A

C

G

DB

E H I J

M

F

LK A0

B C D0

E F0 0

K0

L0 0

G0 0

H I0

J0 0

M0 0

13

A

C

G

DB

E H I J

M

F

LK

A0

B

C

D0

E

F0 0

K0

L0 0

G0 0

H

I0

J0 0

M0 0

14

15

مشخص�ه اص�لي ي�ک درخت دودويي ب�دين ش�کل دارد انش�عاب دو ح�داکثر آن گ�ره ه�ر ک�ه اس�ت يع�ني گ�ره ه�ايي ک�ه درج�ه اي بيش�تر از دو نداش�ته

باشند. س�مت درخت زي�ر دودويي ه�اي درخت ب�راي

چپ و راست با يکديگر متمايز است.

يک درخت دودويي ي�ا تهي اس�ت ي�ا ح�اوي مجموع�ه اي مح�دود از گ�ره ه�ا ش�امل ي�ک ريش�ه و دو زي�ر درخت زي�ر ه�ا درخت اين اس�ت. دودويي درخت

هاي چپ و راست ناميده مي شوند.

تعريف :

structure Binary_tree )abbreviated BinTree ( is objects : a finite set of nodes either empty or consisting of

a root node ، left Binary_tree ، and right Binary_tree. functions :

for all bt ، bt1 ، bt2 BinTree ، item elementBinTree Create)(Boolean IsEmpty )bt(BinTree MakeBT)bt1 ، item ، bt 2(BinTree Lchild)bt(element Data)bt(BinTree Rchild)bt(

16

در هيچ درخت عادي صفر گره وجود ندارد ، اما درخت دودويي تهي وجود دارد.

در يک درخت دودويي ترتيب فرزندان داراي اهميت بوده در حالي که در درخت عادي به اين صورت نيست.

17

در س�طح ه�ا گ�ره تع�داد ح�داکثر i درخت ي�ک ام است.2i-1دودويي

ب�ه دودويي ي�ک درخت در ه�ا گ�ره تع�داد ح�داکثر است.k ، 2k-1عمق

حداکثر تعداد گره ها

18

، اگ�رTبراي ه�ر درخت دودويي غ�ير تهي مانن�د تع�دادگره ه�اي پاي�اني و تع�داد گ�ره ه�اي درج�ه

باشد ، آنگاه خواهيم داشت :2

0n

2n

120 nn

2رابطه بين تعداد گره هاي برگ و گره هاي درجه

19

درخت دودويي پر، يک kيک درخت دودويي پر به عمق گره داشته باشد.2k-1است مشروط به اينكه

است ، اگر و کامل k گره و عمق nيک درخت دودويي با تنها اگر گره هايش مطابق با گره هاي شماره گذاري شده

باشد.kدر يک درخت دودويي پر به عمق گره برابر nارتفاع يك درخت دودويي كامل با

است

)1(log2 n

درخت نم���ايش دو ب��ه دودويي

صورت است :

نمايش آرايه

ليس�ت نم�ايش پيوندي

21

، شيوه شماره گذاري ارايه شده در شکل زيراولين نمايش يک درخت دودويي در حافظه را

مطرح و پيشنهاد مي کند . از آنجايي که گره ها از شماره گذاري شده اند ، يک آرايه يک بعدي n تا 1

مي تواند براي ذخيره سازي گره ها استفاده . شود

A

CB

D F GE

IH

0 -

1 A

2 B

3 C

4 D

5 E

6 F

7 G

8 H

نمايش آرايه اي درخت دودويي

23

گره ) يعنيnاگر يک درخت دودويي کامل با عمق ( به ترتيب باال تعريف شده باشد ، آنگاه براي هر گره

داريم:، ≥ n i 1≥ و i با انديس i=1 ، i است . اگر [i/2] در i ، آنگاه پدر i≠1( اگر 1)◦

ريشه است و پدري نخواهد داشت. است. اگر 2i در i ، آنگاه فرزند چپ 2i≤n( اگر2)◦

2i>n آنگاه ، i.فرزند چپ ندارد 2i+1 در i ، آنگاه فرزند راست 2i+1≤n( اگر 3)◦

فرزند راست نداردi ، آنگاه 2i+1>nاست. اگر

1][log2 n

، به kدر بدترين حالت ، يک درخت مورب به عمق kمحل و موقعيت نياز دارد که از اين مقدار، فقط

محل اشغال مي شود.

12 k

25

ب راي درخت ان دودويي اگرچ ه نم ايش ترتي بي )آراي ه اي( از کام ل بس ياري ب راي م ا ، نظ ر مي رس د ب ه مناس ب

درخت ان ديگ ر ب اعث اتالف حافظ ه ميش ود ب ه عالوه ، اين ن يز ترتي بي نم ايش در موج ود ه اي نارس ايي از روش ، درخت ي ک ه اي گ ره ح ذف ي ا درج اس ت. برخ وردار تغي ير ب اعث خ ود ک ه هاس ت گ ره ج ايي جاب ه مس تلزم ش ماره س طح گ ره ه ا مي ش ود. اين مس ايل مي توان د ب ا

به کارگيري نمايش پيوندي به آساني حل شود.

26

با اين روش هر گره سه فيلد خواهد داشت :left_child ، data ، right_child

ب�ه ش�رح زي�ر تعري�ف مي ش�وند :Cکه در زب�ان

typedef struct node *tree_pointer ;

typedef struct node {

int data ;

tree_pointer left_child ، right_child ;

};

27

class Tree;

class TreeNode

{

friend class Tree;

private:

char data;

TreeNode *LeftChild;

TreeNode *RightChild;

};

class Tree

{

public:

Tree();

Tree(const Tree& t);

private:

TreeNode *root;

};28

left_child data right_child

left_child

data

right_child

نم�ايش ي�ک گ�ره درخت دودويي

ب�ا ه�ر ، ي�ک درخت دودويي پيم�ايش به هنگ�ام رفت�ار مش�ابهي ط�رز ب�ه زيردرخت�انش و گ�ره

ب�ه ت�رتيب ح�رکت ب�ه چپ ، R ، V ، Lک�نيم. اگ�ر مالق�ات ک�ردن ي�ک گ�ره ( ب�راي مث�ال ، چ�اپ فيل�د داده آن گ�ره) و ح�رکت ب�ه راس�ت باش�د، آنگ�اه درخت ي�ک پيم�ايش ب�راي ممکن ت�رکيب ش�ش

خواهيم داشت :

RLV ، RVL ، VRL ، VLR ، LRV ، LVR

30

ب�ه ابت�دا ک�ه ک�نيم انتخ�اب را تنه�ا ح�التي اگ�ر س�مت چپ و بع�د ب�ه س�مت راس�ت ب�رود ، تنه�ا

خ�واهيم داش�ت. VLR ، LRV ، LVRس�ه ت�رکيب نس�بت Vاين س�ه ح�الت را ب�ا توج�ه ب�ه م�وقعيت

و Lب�ه R ت�رتيب ب�ه preordcr ، postorder ، inorder.مي ناميم

مثال

31

پيم�ايش م�وقعي postorderدر گ�ره ي�ک ، مالق�ات و چ�اپ مي ش�ود ک�ه زيردرخت�ان چپ و

راست آن قبال مالقات شده باشند.

، ي�ک گ�ره قب�ل از پيم�ايش preorderدر پيم�ايش زيردرختان چپ و راست ، مالقات مي گردد.

32

درخت زي�ر ح�اوي ي�ک عب�ارت رياض�ي اس�ت : A/B*C*D*+E+

E*

* D

C/

A B

1

2

3

4

5

6 7 9 10

8

11

14

17

1918

1615

1312

عب�ارت ي�ک ب�راي دودويي درخت محاسباتي

33

هنگ�امي ک�ه اين پيم�ايش انتخ�اب مي ش�ود ، ح�رکت ب�ه س�مت پ�ايين ب�ه ط�رف چپ انج�ام مي ش�ود و اين عم�ل ت�ا آخ�رين گ�ره ص�ورت مي گ�يرد س�پس مي ت�وان گ�ره را بازي�ابي ک�رد و بع�د ب�ه س�مت راس�ت رفت�ه و ب�ه همين

ترتيب کار ادامه پيدا مي کند.ش�کل ب�ا متن�اظر ي�ک infixاين

عبارت است.

34

void inorder )tree_pointer ptr (

/* inorder tree traversal */

{

if )ptr( {

inorder ) ptr -> left_child (;

printf )“ % d” ، ptr -> data (;

inorder )ptr -> right_child(;

}

}

35

ح�اوي دس�تورات الزم ب�راي ش�کل preorderتابع دوم پيمايش است.

بر اس�اس اين پيم�ايش ، گ�ره را ابت�دا بازي�ابي را چپ انش�عابات و س�پس نم�وده مالق�ات و دنب�ال و تم�ام گ�ره ه�ا را بازي�ابي مي ک�نيم. اين فرآين�د ادام�ه پي�دا مي کن�د ت�ا ب�ه ي�ک گ�ره تهي برس�يم. در اين نقط�ه ، ب�ه نزديک�ترين ج�دي ک�ه داراي ي�ک فرزن�د راس�ت باش�د مراجع�ه و ب�ا اين

گره شروع خواهيم نمود.

36

+

E*

* D

C/

A B

1

2

3

4

5

6 7 9 10

8

11

14

17

1918

1615

1312

پيم��ايش زي��ر preorderبا درخت ه��اي گ��ره خروجي به شکل زير خواهند داشت :

خروجي + * * / A B C D E

عب�ارت ي�ک ش�کل ب�ه اين prefix.است

37

Vide preorder )tree_pointer ptr (/* preorder tree traversal */{

if )ptr( {printf )“ % d” ، ptr -> data (;preorder ) ptr -> left_child (;preorder )ptr -> right_child(;

}}

38

از قب�ل را گ�ره ي�ک فرزن�د دو پيم�ايش اين بازي�ابي آن گ�ره مالق�ات و چ�اپ مي کن�د. اين ب�دين مفه�وم اس�ت ک�ه فرزن�دان ي�ک مس�اله

گره قبل از خود آن گره بازيابي مي گردد.

39

ش�کل زي�ر postorderخروجي حاص�ل از پيم�ايش به صورت زير است :

+

E*

* D

C/

A B

1

2

3

4

5

6 7 9 10

8

11

14

17

1918

1615

1312

خروجي A B/ C* D* E +

عب�ارت ي�ک مانن�د خ�روجي اين postfix.است

40

Void iter_pointer (tree_pointer node ){

int top = -1 ; /* initialize stack */tree_pointer stack [MAX_STACK_SIZE] ;for ( ; ; ) {

for (; node ; node = ->left_child)add ( &top ، node ); /* add to stack */

node = delete (&top); /*delete from stack */if (! Node) break ; /* empty stack*/printf (“ % d”، node-> data ) ;node = node -> right_child;

}}

41

غيربازگشتي غيربازگشتيinorderinorder پيمايش پيمايش 3-53-5

: ف�رض کني�د تع�داد گ�ره ه�اي inorder2تحلي�ل را در iter_inorder باش�د ، اگ�ر عم�ل nدرخت

نظ�ر بگ�يريم ، مش�اهده مي ش�ود ک�ه ه�ر گ�ره درخت فق�ط ي�ک ب�ار در پش�ته ق�رار گرفت�ه و ي�ا از آن خ�ارج مي ش�ود. بن�ابراين اگ�ر تع�داد

درخت ه�اي زم�ان nگ�ره پيچي�دگي ، باش�د مي باش�د. حافظ�ه م�ورد O(n)ت�ابع براب�ر ب�ا

ني�از براب�ر ب�ا عم�ق درخت اس�ت ک�ه مس�اوي مي باشد.O(n)با

42

چ�ه inorder ، preorder ، postorderپيم�ايش ه�اي ب�ه ص�ورت بازگش�ت پ�ذيري نوش�ته ي�ا ب�ه ص�ورت مي پش��ته نيازمن��د همگي ، غيربازگش��تي

باشند.

اين پيم�ايش ، ت�رتيب س�طحي ، ابت�دا ريش�ه را بازي�ابي ، س�پس فرزن�د چپ ريش�ه و ب�ه دنب�ال آن فرزن�د راس�ت ريش�ه بازي�ابي مي گ�ردد. اين ش�يوه ب�ا بازي�ابي از گ�ره منتهي الي�ه س�مت چپ مي تک�رار جدي�د ه�ر س�طح راس�ت س�مت ب�ه

گردد. اين پيمايش از صف استفاده مي کند.

43

پيمايش ترتيب سطحي پيمايش ترتيب سطحي3-53-5

ب�ه زي�ر درخت س�طحي ت�رتيب پيم�ايش صورت زير است :

+

E*

* D

C/

A B

1

2

3

4

5

6 7 9 10

8

11

14

17

1918

1615

1312

+ *E *D / C A B

44

کپي کردن درختان دودويي -1کپي کردن درختان دودويي -1

- تعيين برابري و تساوي دو درخت2- تعيين برابري و تساوي دو درخت2

Satisfiability- مساله 3 Satisfiability- مساله 3

45

دودويي درخت ي�ک در تهي اتص�االت تع�داد بيشتر از تعداد اشاره گرهاي غيرتهي است.

تع�داد ي�ک درخت دودويي از n + 1در اتص�ال تهي اس�ت. ي�ک راه 2nک�ل اتص�االت آن يع�ني ،

پ�رلين ب�راي ب�ه ک�ارگيري اين اتص�االت توس�ط پيش�نهاد ش�د. راه ح�ل اين ب�ود ک�ه از و ت�ورنتن

اتص�االت تهي ب�راي ارتب�اط ب�ا ديگ�ر گ�ره ه�اي اين ص�ورت در ک�ه اس�تفاده ش�ود ي�ک درخت

مي نامند.درخت نخي درخت را

46

زي��ر ق��وانين از نخي اتص��االت ايج��اد براي استفاده مي شود :

تهي باش�د ، آن را ط�وري ptr-> left_child اگ�ر 1)تغي�ير مي دهيم ک�ه ب�ه گ�ره اي ک�ه در پيم�ايش

inorder قبل از ptr.قرار دارد ، اشاره کند

اگ�ر 2) ptr-> right_child را آن ، باش�د تهي ط�وري تغي�ير مي دهيم ک�ه ب�ه گ�ره اي ک�ه در

ق�رار دارد ، اش�اره ptr بع�د از inorderپيم�ايش کند.

47

هنگ�امي ک�ه درخ�تي را در حافظ�ه نم�ايش مي دهيم ، بايس�تي بت�وانيم بين اتص�االت نخي و ب�ا را ک�ار اين قاي�ل ش�ويم. تف�اوتي واقعي انج�ام ب�ه ه�ر گ�ره اف�زودن دو فيل�د اض�افي

right_thread ، left_threadمي دهيم ک�ه آنه�ا را مي ناميم.

48

A

CB

D F GE

IH

درخت نخي متناظر

A

CB

D F GE

IH

اتصاالت نخي

49

مانن�د گ�ره ه�ر درخت ptrبراي ي�ک در ، ptr->right_thread = TRUEدودويي ، چنانچ�ه

بع�دي گ�ره تعري�ف طب�ق ، در ptrباش�د مي باش�د inorder ، ptr->right_childپيم�ايش

، ب�ا پ�ايين ptr. در غ�ير اين ص�ورت گ�ره بع�دي چپ فرزن��دان مس��ير روي از ptrرفتن

ت�ا وق�تي ک�ه ptrط�رف فرزن�د س�مت راس�ت وض�عيت ب�ا اي گ�ره left_thread = TRUEب�ه

برسيم ، تعيين مي شود .

50

گ�ره insuccتابع ، پش�ته از اس�تفاده ب�دون پيم�ايش در درخت inorderبع�دي ي�ک در را

نخي دودويي پيدا مي کند.

پيم��ايش ب��ا inorderبراي ت��وانيم مي مک�رر را insuccفراخ�واني ه�ا گ�ره تم�ام

بازيابي کنيم .

51

threaded_pointer insucc (threaded_pointer tree){/* find the inorder sucassor of tree in a threaded binary tree */

threaded_pointer temp ;temp = tree -> right_child ;if (! Tree -> right_thread)

while (! temp -> left_thread)temp = temp -> left_child ;

return temp ;}

: insuccتابع

در خ�اص گ�ره ي�ک ، بع�د گ�ره نم�ودن پي�دا inorderپيمايش

52

Void tinorder (threaded_pointer tree){/* traverse the threaded binary tree inorder */

threaded_pointer temp = tree ;for ( ; ; ) {

temp = insucc (temp) ;if (temp = tree ) break ;printf (“ % 3c” ، temp -> data ) ;

}}

53

نحوه اضافه كردن يك گره جديد به درخت نخ كشي شده رابررسي نماييد.

براي ارائه روش از نرم افزارpower point براي انيميشن دادن به كار استفاده نماييد.

بايد الگوريتم كار با دقت آورده شده و ميتوانيد از شبه كدنيز استفاده كنيد.

54

max treemax tree درخ�تي اس�ت ک�ه مق�دار کلي�د ه�ر گ�رهآن کمتر از مقادير کليدهاي فرزندانش نباشد.

max heapmax heap ي�ک درخت دودويي کام�ل اس�ت ک�ه نيز مي باشد.max treeيک

min treemin tree درخ�تي اس�ت ک�ه مق�دار کلي�د ه�ر گ�ره فرزن��دانش کلي��دهاي مق��ادير از بيش��تر آن

نباشد.

min heapmin heap ک�ه ي�ک درخت دودويي کام�ل اس�ت مي باشد.min treeدر واقع يک

55

14

712

10

8

[1]

[2]

[4] [ 5]

[3]

6

[6]

2

47

10

8

[1]

[2]

[4] [5]

[3]

6

[6]

9

36

5

[1]

[2]

[4]

[3]

10

83

20

50

[1]

[2]

[4]

[3]

max heapمثال از

min heapمثال از

56

تهي(heap)ايجاد يک هرم

(heap)جايگذاري عنصر جديد به هرم

(heap)حذف بزرگترين عنصر از هرم

57

ص�ف اول�ويت ص�ف اول�ويت غالب�ا ه�رم ه�ا ب�راي پي�اده س�ازي استفاده مي شوند. هاها

در ص�ف اول�ويت ه�ا عنص�ري ک�ه داراي ب�االترين ، ح�ذف مي اول�ويت هس�ت ( ت�رين پ�ايين ي�ا )

شود.

ص�ف • ي�ک ب�راي نم�ايش ت�رين س�اده آراي�ه اولويت مي باشد.

58

)(log 2 nO)(log 2 nO

Representation Insertion Deletion

Unordered array Θ(1) Θ(n)

Unordered linked list Θ(1) Θ(n

Stored array O(n) Θ(1)

Stored linked list O(n) Θ(1)

Max heap

59

20

215

14

[1]

[2]

[4]

[3]

10

[5]

قب ل از heapال ف - درخت درج

گ ره اولي ه مح ل - ب جديد

عنص��ر درج جديد

م��وقعيت ه��ر در جدي��د گ��ره ک��ردن اض��افه ،تعري�ف زي�را heapديگ�ري کن�د مي نقض را

نتيجه يک درخت دودويي کامل نخواهد بود.

20

215

14

[1]

[2]

[4]

[3]

10

[5]

60

61

از آنجا کهheap يک درخت کامل با n عنصر مي مي باشد. اين بدين )log2)nباشد ، داراي ارتفاع

)log2)n به ميزانwhileمعني مي باشد که حلقه تکرار شود. بنابراين پيچيدگي تابع درج برابر

log2)n( .مي باشد

62

20

215

14

[1]

[2]

[4]

[3]

10

[5]

ح�ذف مي max heapهنگ�امي ک�ه عنص�ري از درخت ريش�ه از را آن ، مي heapش�ود

گيريم.

215

14

[1]

[2]

[4]

[3]

[5]

20 removed

max heapحذف يک عنصر از

63

64

مي باشد.پيچيدگي حذف برابر

زمان حذف يک عنصر دلخواه از درختheap با n مي باشد. )O)nعنصر ، برابر

)(log 2 nO

65

ي�ک درخت دودويي اس�ت يک درخت جس�تجوي تهي درخت اگ�ر باش�د. تهي اس�ت ممکن ک�ه

نباشد خصوصيات زير را برآورده مي کند :

ه�ر عنص�ر داراي ي�ک کلي�د اس�ت و دو عنص�ر واق�ع در ، باش�ند يکس�ان کلي�د داراي نباي�د

کليدها منحصر به فردند.

کلي�دهاي واق�ع در زي�ردرخت غ�يرتهي چپ باي�د کم�تر از مق�دار کلي�د واق�ع در ريش�ه زي�ردرخت

راست باشد.

کلي�دهاي واق�ع در زي�ردرخت غ�يرتهي راس�ت ريش�ه در واق�ع کلي�د مق�دار از بزرگ�تر باي�د

زيردرخت چپ باشد.

درخت�ان خ�ود ن�يز راس�ت و چپ زيردرخت�ان جستجوي دودويي ميباشند.

66

30

40

5

2

مثال

67

class BSTNode{

friend class BST;private:

BSTNode *left;int key;BSTNode *right;

public:int GetKey();

};

class BST{public:

BST();bool Insert(int key);BSTNode* Search(int key);void DeleteNode(BSTNode* pNode,bool bRight);

private:BSTNode *root;

};

ش�ده نوش�ته كالس ش�ده در نوش�ته كالس در ف�رض ش�ده ك�ه ه�ر گ�ره ف�رض ش�ده ك�ه ه�ر گ�ره كلي�د مق�دار ي�ك كلي�د تنه�ا مق�دار ي�ك تنه�ا ط�راحي در ولي ط�راحي دارد در ولي دارد پيش�رفته ت�ر ميت�وان از پيش�رفته ت�ر ميت�وان از

قالبها استفاده نمود. قالبها استفاده نمود.

68

ب�ا عنص�ري دنب�ال باش�يم خواس�ته کني�د فرض ابت�دا از ريش�ه keyکلي�د ش�روع )root( بگ�رديم.

، ک�نيم درخت مي ، باش�د تهي ريش�ه اگ�ر جس�تجو و ب�وده عنص�ري ه�ر فاق�د جس�تجو

را ب�ا keyن�اموفق خواه�د ب�ود. در غ�ير اين ص�ورت با مقدار کليد ريشه مقايسه کرده :

اگ�ر key ، باش�د از مق�دار کلي�د ريش�ه کم�تر هيچ عنص�ري در زي�ردرخت راس�ت وج�ود ن�دارد

براب�ر کلي�دي داراي بن�ابراين keyک�ه ، باش�د زيردرخت چپ ريشه را جستجو مي کنيم.

بزرگ�تر از مق�دار کلي�د ريش�ه باش�د ، key اگ�ر زيردرخت راست را جستجو مي کنيم. 69

ارتف�اع ي�ا عم�ق ي�ک درخت جس�تجوي hاگ�ر در م�دت را ، عم�ل جس�تجو باش�د دودويي

O(h).انجام مي شود

70

BSTNode* BST::Search(int key){

return Search(root , key);}BSTNode* BST::Search(BSTNode* p, int key){

if (!p)return 0;

if(key ==p→key)return p;

if(key <p→key)return Search(p→left , key);

elsereturn Search(p→right , key);

}

71

BSTNode* BST::Search(int key){

BSTNode *p=root;while(p!=NULL){

if(key < p→key)p = p→left;

else if(key > p→key)p = p→right;

else return p;

}return 0;

}

72

، ابت�دا باي�د keyبراي درج عنص�ر جدي�دي ب�ه ن�ام موج�ود عناص�ر ب�ا کلي�د آي�ا ک�ه نم�ود مش�خص متف�اوت اس�ت ي�ا خ�ير. ب�راي انج�ام اين ک�ار باي�د ن�اموفق اگرجس�تجو ک�رد، جس�تجو را درخت را در محلي ک�ه جس�تجو خاتم�ه ، عنص�ر باش�د

پيدا نموده است ، درج مي کنيم.

73

30

40

5

2

30

40

5

2 80

30

40

5

2 35

80

ي جايگذار

80

ي ار

گذايج

35

مثال

74

در ي�ک numزم�ان الزم ب�راي جس�تجوي براب�ر نح�وي O(h)درخت ب�ه باش�د مي

درخت hک�ه ارتف�اع ي�ا عم�ق ب�ا براب�ر Θ(1)اس�ت. بقي�ه الگ�وريتم ني�از ب�ه زم�ان

ني�از م�ورد ک�ل زم�ان بن�ابراين دارد. insert_node برابر با Θ(h) .مي باشد

75

bool BST::Insert(int key){

BSTNode *p=root;BSTNode *q;while(p!=NULL){

q = p;if(key < p→key)

p = p→left;else if(key > p→key)

p = p→right;else

return false; //Error for duplicate key}p = new BSTNode (key);if (!root){

root = p;return true;

}if(key < q→key)

q→left = p;else

q→right = p;return true;

} 76

از درخت زي�ر باي�د فيل�د فرزن�د 35براي ح�ذف ق�رار داده NULLچپ وال�د اين گ�روه را براب�ر

و گره را آزاد نمود :30

405

2 35 80

77

زم�اني ک�ه ي�ک گ�ره ب�رگ ب�ا دو فرزن�د ح�ذف مي ش�وند ، گ�ره را ب�ا بزرگ�ترين عنص�ر در زي�ر در عنص��ر کوچک��ترين ي��ا و چپ درخت زي�ردرخت راس�ت آن گ�ره ج�ايگزين و تع�ويض

کرد.

انج�ام مي گ�يرد ، O(h)عم�ل ح�ذف در زم�ان عمق درخت مي باشد.hبه نحوي که

78

void DeleteNode (BSTNode* pNode,bool bRight){ BSTNode *CurNode = pNode→left; if (bRight) CurNode = pNode→right; if( !CurNode→right && !CurNode→ left) { delete CurNode; return; } if(CurNode→right && !CurNode→ left) { if (bRight) pNode→right = CurNode→right; else pNode→left = CurNode→right; delete CurNode; return; } if(!CurNode→right && CurNode→ left) { if (bRight) pNode→right = CurNode→left; else pNode→left = CurNode→left; delete CurNode; return; }

if(CurNode→right && CurNode→ left) { BSTNode *tmp = CurNode→left; pNode = CurNode; bRight = false; while (tmp→right) {

pNode = tmp; bRight = true;

tmp = tmp→right; } CurNode→key = tmp→key; DeleteNode(pNode , bRight); }}

79

عم�ق بيش�ترين ب�ا جس�تجو درخت�ان درخت�ان ،جستجوي متعادل ناميده مي شوند.

ک�ه دارن�د وج�ود متع�ادلي جس�تجوي درخت�ان O(h)عم�ل جس�تجو ، درج و ح�ذف را در زم�ان

، red_blackممکن مي س�ازند از جمل�ه درخت�ان 2-3 ، AVL

)(log 2 nO

80

مجموع�ه و رش�ته م�رتب ش�ده kفرض کني�د داراي اي از عناص�ر هس�تيم ک�ه باي�د در ي�ک رش�ته واح�د ادغ�ام ش�وند. ه�ر دنبال�ه ي�ا ت�رتيب ش�امل تع�دادي رک�ورد ب�ه ت�رتيب غ�يرنزولي و فيل�د مشخص�ي ب�ه

مي باشد.keyنام

اجرا اجرا يک دنباله مرتب((runrun(( .ناميده مي شود

ک�ه کني�د در n ف�رض تع�داد رکورده�ا ،k اج�را ب�ا ب�ا تک�رار رک�ورد باش�د، عم�ل ادغ�ام مي توان�د

کوچکترين کليد انجام شود.

81

امک�ان موج�ود k کوچک�ترين کلي�د باي�د ازبين از ه�ر kپي�دا ش�ود و مي توان�د رک�وردي قب�ل

باشد.)k-runs(اجرا

، )k-runs( اج�را k به�ترين روش ب�راي ادغ�ام انتق�ال k-1نيازمن�د و تع�يين ب�راي مقايس�ه

رکورد بعدي به خروجي مي باشد.

، مي ت�وانيم ب�ا اس�تفاده از اي�ده k>2 ب�ه ازاي الزم ه�اي مقايس�ه تع�داد ، انتخ�ابي درخت جهت تعيين کوچکترين عنصر را کاهش دهيم.

82

يک درخت انتخ�ابي ، ي�ک درخت دودويي اس�ت ک�ه ه�ر گ�ره آن کوچک�تر از دو فرزن�د خ�ود مي دهن�ده نش�ان ريش�ه گ�ره ، بن�ابراين باش�د

کوچکترين گره در درخت مي باشد.

83

6

86

9 8 17

6

910

620

98 17

90

[1]

[2]

[4]

[3]

[5]

[12][11][10][9][8]

[6]

[14][13] [15]

[7]

1

5

1

6

مثال

2

0

3

8

2

0

3

0

1

5

2

5

1

5

5

0

1

1

1

6

10

0

11

0

1

8

2

0

run1 run 2 run 3 run 4 run 5 run 8run 7run 6

مي باشد. درخت برابر زمان تجديد ساختار

تمام زمان الزم براي ادغام nمي باشد. رکورد برابر

زمان کل الزم جهت ادغام k اجرا (run) مي برابر باشد.

85

)(log 2 kO

)log( 2 knO

)log( 2 knO

درخت مجزا مي باشد.n ≥ 0جنگل مجموعه

اگر ريشه درخت را حذف کنيم ، آنگاه داراي يک جنگل خواهيم بود.

86

براي تبديل اين جنگل به يک درخت دودويي واحد :ب ه از درخت ان جنگ ل را ي ک نم ايش دودويي ه ر ابت دا

دست مي آوريمسپس تم ام درخت ان دودويي را از طري ق فيل د هم زاد

گره ريشه به يکديگر متصل مي کنيم.

87

A

DB C

E

F

G

IH

A

EB

F G

I

H

C

D

تبديل به درخت دودويي

88

دودويي اگ ر درخت آنگ اه ، باش د درخت ان از جنگلي :Bمتناظر با اين جنگل يعني

باشد ، تهي خواهد بود.n=0اگر )1(ريش ه)2( ب ا براب ر اي ريش ه داراي داراي ، باش د مي

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

nTT ,...,1

),...,( 1 nTT

)( 1T)( 1T),...,( 2 nTTB

89

postorder ، inorder ، preorderپيم�ايش ه�اي دودويي درخت جنگ�ل Tمتن�اظر ي�ک F

Fداراي ي�ک تن�اظر ط�بيعي ب�ا پيم�ايش ه�اي مي باشند.

90

ب�ه preorderپيم�ايش مرب�وط T ب�ا مع�ادل مي preorder در درخت Fبازي�ابي گ�ره ه�اي

باشد:

تهي باشد ، برگرديد.Fاگر •

را بازيابي کنيد.F ريشه درخت اول •

ص�ورت • ب�ه را اول درخت ، زي�ردرخت preorder.پيمايش کنيد

درخت�ان • س�اير F ص�ورت ب�ه را preorder پيمايش کنيد.

91

ب�ه inorderپيم�ايش مرب�وط T گ�ره مع�ادل درخت Fه�اي در inorder ب�ه ک�ه اس�ت

صورت زير تعريف مي شود :

تهي باشد ، برگرديد.F اگر •ب�ه ص�ورت • را اول ، درخت ريش�ه درخت

inorder.پيمايش کنيد ريشه درخت اول را بازيابي کنيد.•ص�ورت • ب�ه را درخت�ان س�اير inorder

پيمايش کنيد.

92

پيم�ايش ب�راي ب�راي ط�بيعي مع�ادل گون�ه هيچ postorder جنگ�ل ي�ک متن�اظر دودويي درخت

را F ي�ک جنگ�ل postorderوج�ود ن�دارد . پيم�ايش به صورت زير بيان ي کنيم :

تهي باشد ، برگرديد.F) اگر 1درخت 2 اولين ، زي�ردرخت (F ص�ورت ب�ه را

postorder.پيمايش کنيد را ب�ه ص�ورت F) س�اير درخت�ان ب�اقي مان�ده3

postorder.پيمايش کنيد را بازيابي کنيد F) ريشه اولين درخت4

93

از ت�ا 0ده عض�و ب�ه س�ه مجموع�ه 9 ک�ه مي ، باش�ند ش�ده تفکي�ک هم از مج�زا

}5,3,2,,{}9,4,1,{}8,7,6,0{توانند بدين صورت باشند : 123 SSS

0

86 7

4

91

2

53

1S 2S 3S

مثال

94

در ه ر مجموع ه ب ر خالف معم ول ک ه اش اره گره ا ب ه از وال د ب ه فرزن دان در نظ ر گرفت ه مي ش دند، در اينج ا اش اره گره ا از فرزن دان ب ه وال د تنظيم مي پ دري رابط ه ب ا ه ا گ ره حقيقت در ي ا و ش وند

اتصال يافته اند.

95

حداقل اعم�الي ک�ه ب�ر روي مجموع�ه انج�ام مي شود ، به شرح زير است :

دو : اگ�ر )union(اجتم�اع مجموع�ه مج�زا 1)ب�ه آنه�ا انگ�اه اجتم�اع ، مجموع�ه مج�زا باش�ند

صورت زير تعريف مي شود :

ji SوS

jiUSS باش�د ي�ا عض�و ي�ا عض�وx ک�ه x{ هم�ه اعض�ا ب�ه ص�ورت {

iSSj

2 (find(i) پي�داکردن )i ک�ه اي مجموع�ه : ( i عضو آن است را پيدا کنيد

96

مثال

21USS

0

86 7 4

91

97

: اگ�ر تع�دا گ�ره Union(i,j ) ب�رايWeightingقانون کم�تر از تع�داد گ�ره ه�ا در درخت iه�ا در درخت

j ، باش�د j را وال�د i در غ�ير اين ص�ورت ، i را قرار مي دهيم.jوالد

تعريف

98

باي�د ب�دانيم Weightingبراي پي�اده س�ازي ق�انون ک�ه در ه�ر درخت چن�د گ�ره وج�ود دارد. اين ک�ار را ب�دين ت�رتيب انج�ام مي دهيم ک�ه در ريش�ه ه�ر

ي�ک i ق�رار مي دهيم. اگ�ر countدرخت ي�ک فيل�د تع�داد گ�ره count[i]گ�ره ريش�ه باش�د ، آنگ�اه در ب�ه ص�ورت ي�ک Countه�اي آن درخت خواه�د ب�ود.

فيل�د در منفي گذاش�ته مي ش�ود. parentع�دد را بي�ان مي ک�نيم ، Weighting زم�اني ک�ه ق�انون

را ص�ورت اين ب�ه اجتم�اع مي union2عم�ل ناميم.

99

1][log 2 n

n ي�ک درخت ب�ا T ف�رض کني�د اص�ل موض�وعي :اص�ل موض�وعي : ايج�اد ش�ده باش�د ، union2گ�ره باش�د ک�ه توس�ط

در گ�رهي هيچ ص�ورت اين س�طحي Tدر ، نخواهد داشت. بيشتر از

عض�و وج�ود داش�ته باش�د ، nاگ�ر در ي�ک درخت بيش�ترين زم�ان ب�راي ي�افتن ي�ک عض�و ب�ه ص�ورت

خواهد بود. )(log 2 nO

)log( 2 nmnO از ترکي�بي و union عم�ل n-1اگ�ر mعمل find

داش�ته باش�يم ، در ب�دترين ح�الت ممکن ، زم�ان درمي آيد. به صورت

گ�رهي روي j اگ�ر تعري�ف ( ق�انون تخ�ريب ) :تعري�ف ( ق�انون تخ�ريب ) : را فرزن�د j ت�ا ريش�ه خ�ود باش�د ، آنگ�اه iمس�ير از

ريشه قرار دهيد.

100