Xem mẫu

  1. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o { BinT_Type NewNode = BinT_Create_Node(NewData); c u -tr a c k c u -tr a c k if (NewNode == NULL) return (NewNode); if (BT_Tree == NULL) BT_Tree = NewNode; else { BinT_Type Rnode = BT_Tree; while (Rnode->BinT_Right != NULL) Rnode = Rnode->BinT_Right; Rnode->BinT_Right = NewNode; } return (NewNode); } d. Duyeät qua caùc nuùt treân caây nhò phaân: Trong thao taùc naøy chuùng ta tìm caùch duyeät qua (gheù thaêm) taát caû caùc nuùt trong caây nhò phaân ñeå thöïc hieän moät thao taùc xöû lyù naøo ñoù ñoái vôùi nuùt naøy (Xem noäi dung thaønh phaàn döõ lieäu chaúng haïn). Caên cöù vaøo thöù töï duyeät nuùt goác so vôùi 2 nuùt goác caây con, thao taùc duyeät coù theå thöïc hieän theo moät trong ba thöù töï: - Duyeät theo thöù töï nuùt goác tröôùc (Preorder): Theo caùch duyeät naøy thì nuùt goác seõ ñöôïc duyeät tröôùc sau ñoù môùi duyeät ñeán hai caây con. Caên cöù vaøo thöù töï duyeät hai caây con maø chuùng ta coù hai caùch duyeät theo thöù töï nuùt goác tröôùc: + Duyeät nuùt goác, duyeät caây con traùi, duyeät caây con phaûi (Root – Left – Right) + Duyeät nuùt goác, duyeät caây con phaûi, duyeät caây con traùi (Root – Right - Left) - Duyeät theo thöù töï nuùt goác giöõa (Inorder): Theo caùch duyeät naøy thì chuùng ta duyeät moät trong hai caây con tröôùc roài ñeán duyeät nuùt goác vaø sau ñoù môùi duyeät caây con coøn laïi. Caên cöù vaøo thöù töï duyeät hai caây con chuùng ta cuõng seõ coù hai caùch duyeät theo thöù töï nuùt goác giöõa: + Duyeät caây con traùi, duyeät nuùt goác, duyeät caây con phaûi (Left – Root - Right) + Duyeät caây con phaûi, duyeät nuùt goác, duyeät caây con traùi (Right – Root - Left) - Duyeät theo thöù töï nuùt goác sau (Postorder): Töông töï nhö duyeät theo nuùt goác tröôùc, trong caùch duyeät naøy thì nuùt goác seõ ñöôïc duyeät sau cuøng so vôùi duyeät hai nuùt goác caây con. Do vaäy, caên cöù vaøo thöù töï duyeät hai caây con maø chuùng ta cuõng coù hai caùch duyeät theo thöù töï nuùt goác sau: + Duyeät caây con traùi, duyeät caây con phaûi, duyeät nuùt goác (Left – Right - Root) + Duyeät caây con phaûi, duyeät caây con traùi, duyeät nuùt goác (Right – Left - Root) Trong phaàn naøy chuùng ta chæ trình baøy moät caùch duyeät theo moät thöù töï cuï theå ñoù laø: Duyeät caây con traùi, duyeät nuùt goác vaø duyeät caây con phaûi (Left – Root – Right) vaø söû duïng thuaät toaùn ñeä quy. Caùc caùch duyeät khaùc baèng thuaät toaùn ñeä quy hay khoâng ñeä quy sinh vieân töï vaän duïng töông töï. - Thuaät toaùn ñeä quy ñeå duyeät caây nhò phaân theo thöù töï Left – Root – Right (LRootR): B1: CurNode = BinTree Trang: 158
  2. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o B2: IF (CurNode = NULL) c u -tr a c k c u -tr a c k Thöïc hieän Bkt B3: LRootR (BinTree->BinT_Left) // Duyeät caây con traùi B4: Process (CurNode->Key) // Xöû lyù thoâng tin nuùt goác B5: LRootR (BinTree->BinT_Right) // Duyeät caây con phaûi Bkt: Keát thuùc - Minh hoïa thuaät toaùn: Giaû söû chuùng ta caàn duyeät qua caùc nuùt trong caây nhò phaân döôùi ñaây theo thöù töï Left – Root – Right: BinTree 40 36 55 12 18 45 21 NULL NULL NULL NULL 10 8 NULL NULL NULL NULL 11 5 NULL NULL NULL NULL LRootR(BinTree->BinT_Left) LRootR(BinTree->BinT_Left->BinT_Left) LRootR(NULL) Process(12) LRootR(NULL) Process(36) LRootR(BinTree->BinT_Left->BinT_Right) LRootR(NULL) Process(18) LRootR(NULL) Process(40) LRootR(BinTree->BinT_Right) LRootR(BinTree->BinT_Right->BinT_Left) LRootR(BinTree->BinT_Right->BinT_Left->BinT_Left) LRootR(NULL) Process(10) LRootR(NULL) Trang: 159
  3. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o Process(45) c u -tr a c k c u -tr a c k LRootR(BinTree->BinT_Right->BinT_Left->BinT_Right) LRootR(BinTree->BinT_Right->BinT_Left->BinT_Right->BinT_Left) LRootR(NULL) Process(11) LRootR(NULL) Process(8) LRootR(BinTree->BinT_Right->BinT_Left->BinT_Right->BinT_Right) LRootR(NULL) Process(5) LRootR(NULL) Process(55) LRootR(BinTree->BinT_Right->BinT_Right) LRootR(NULL) Process(21) LRootR(NULL) Nhö vaäy thöù töï caùc thoâng tin cuûa caùc nuùt ñöôïc xöû lyù nhö sau: 12 -> 36 -> 18 -> 40 -> 10 -> 45 -> 11 -> 8 -> 5 -> 55 -> 21 - Caøi ñaët thuaät toaùn: Haøm BinT_LRootR_Travelling coù prototype: void BinT_LRootR_Travelling(BinT_Type BT_Tree); Haøm thöïc hieän thao taùc duyeät qua taát caû caùc nuùt trong caây nhò phaân BT_Tree theo thöù töï duyeät Left – Root – Right ñeå xöû lyù thoâng tin ôû moãi nuùt. void BinT_LRootR_Travelling(BinT_Type BT_Tree) { if (BT_Tree == NULL) return; BinT_LRootR_Travelling (BT_Tree->BinT_Left); Process (BT_Tree->Key) BinT_LRootR_Travelling (BT_Tree->BinT_Right); return; } Löu yù: Haøm Process thöïc hieän vieäc xöû lyù thoâng tin (Key) cuûa moãi nuùt. Do vaäy tuøy töøng tröôøng hôïp cuï theå maø chuùng ta vieát haøm cho phuø hôïp. Chaúng haïn ñeå xuaát thoâng tin thì chæ caàn caùc leänh xuaát döõ lieäu ñeå xuaát thaønh phaàn Key. e. Tính chieàu cao cuûa caây: Ñeå tính chieàu cao cuûa caây (TH) chuùng ta phaûi tính chieàu cao cuûa caùc caây con, khi ñoù chieàu cao cuûa caây chính laø chieàu cao lôùn nhaát cuûa caùc caây con coäng theâm 1 (chieàu cao nuùt goác). Nhö vaäy thao taùc tính chieàu cao cuûa caây laø thao taùc tính ñeä quy chieàu cao cuûa caùc caây con (chieàu cao cuûa caây con coù goác laø nuùt laù baèng 1). - Thuaät toaùn: Trang: 160
  4. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o B1: IF (BinTree = NULL) c u -tr a c k c u -tr a c k B1.1: TH = 0 B1.2: Thöïc hieän Bkt B2: THL = TH(BinTree->BinT_Left) B3: THR = TH(BinTree->BinT_Right) B4: IF (THL > THR) TH = THL + 1 B5: ELSE TH = THR + 1 Bkt: Keát thuùc Ví duï: Chieàu cao cuûa caây nhò phaân sau baèng 4. BinTree 40 36 55 2 4 12 18 3 45 21 1 1 2 1 0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 8 0 NULL 0 NULL 1 0 NULL 0 NULL - Caøi ñaët thuaät toaùn: Haøm BinT_Height coù prototype: int BinT_Height(BinT_Type BTree); Haøm tính chieàu cao cuûa caây BTree theo thuaät toaùn ñeä quy. Haøm traû veà chieàu cao cuûa caây caàn tính. int BinT_Height(BinT_Type BTree) { if (BTree == NULL) return (0); int HTL = BinT_Height(BTree->BinT_Left); int HTR = BinT_Height(BTree->BinT_Right); if (HTL > HTR) return (HTL+1); return (HTR+1); } f. Tính soá nuùt cuûa caây: Töông töï nhö tính chieàu cao cuûa caây, soá nuùt cuûa caây (NN) baèng toång soá nuùt cuûa hai caây con coäng theâm 1. Do vaäy thao taùc naøy chuùng ta cuõng seõ tính ñeä quy soá nuùt cuûa caùc caây con (soá nuùt cuûa caây con coù goác laø nuùt laù baèng 1). Trang: 161
  5. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o - Thuaät toaùn: c u -tr a c k c u -tr a c k B1: IF (BinTree = NULL) B1.1: NN = 0 B1.2: Thöïc hieän Bkt B2: NNL = NN(BinTree->BinT_Left) B3: NNR = NN(BinTree->BinT_Right) B4: NN = NNL + NNR + 1 Bkt: Keát thuùc Ví duï: Soá nuùt cuûa caây nhò phaân sau baèng 8. BinTree 40 36 55 12 18 45 21 NULL NULL NULL NULL NULL 8 NULL NULL 0 0 0 0 0 0 0 1(0+0+1) 1 (0+0+1) NULL NULL 1 (0+0+1) 3 (1+1+1) 0 0 1 (0+0+1) 2 (0+1+1) 4 (2+1+1) 8 (3+4+1) - Caøi ñaët thuaät toaùn: Haøm BinT_Num_Node coù prototype: int BinT_Num_Node(BinT_Type BTree); Haøm tính soá nuùt cuûa caây BTree theo thuaät toaùn ñeä quy. Haøm traû veà soá nuùt cuûa caây caàn tính. int BinT_Num_Node(BinT_Type BTree) { if (BTree == NULL) return (0); int NNL = BinT_Num_Node(BTree->BinT_Left); int NNR = BinT_Num_Node(BTree->BinT_Right); return (NNL + NNR + 1); } g. Huûy moät nuùt treân caây nhò phaân: Vieäc huûy moät nuùt trong caây coù theå laøm cho caây trôû thaønh röøng. Do vaäy trong thao taùc naøy neáu chuùng ta tieán haønh huûy moät nuùt laù thì khoâng coù ñieàu gì xaûy ra, song neáu huûy Trang: 162
nguon tai.lieu . vn