1 / 72

TREES (Cấu trúc cây)

TREES (Cấu trúc cây). Mục tiêu. Giới thiệu khái niệm cấu trúc cây . Cấu trúc dữ liệu cây nhị phân tìm kiếm : tổ chức , các thuật toán , ứng dụng . Giới thiệu cấu trúc dữ liệu cây nhị phân tìm kiếm. Cấu trúc cây. Cấu trúc cây.

phil
Download Presentation

TREES (Cấu trúc cây)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. TREES (Cấutrúccây)

  2. Mụctiêu • Giớithiệukháiniệmcấutrúccây. • Cấutrúcdữliệucâynhịphântìmkiếm: tổchức, cácthuậttoán, ứngdụng. • Giớithiệucấutrúcdữliệucâynhịphântìm kiếm Caáu truùc Döõ lieäu - Caáu truùc caây

  3. Cấutrúccây

  4. Cấutrúccây • Địnhnghĩa :câylàmộttậphợpTcácphầntử (gọilànútcủacây) trongđócó 1 nútđặcbiệtđượcgọilàgốc, cácnútcònlạiđượcchiathànhnhữngtậprờinhauT1, T2 , ... , TntheoquanhệphâncấptrongđóTicũnglàmộtcây. Mỗinút ở cấpisẽquảnlýmộtsốnút ở cấpi+1. Quanhệnàyngườitacòngọilàquanhệcha-con. Caáu truùc Döõ lieäu - Caáu truùc caây

  5. Cấutrúccây Caáu truùc Döõ lieäu - Caáu truùc caây

  6. Cấutrúccây Caáu truùc Döõ lieäu - Caáu truùc caây

  7. CấutrúccâyMộtsốkháiniệmcơbản • Bậccủamộtnút :làsốcâyconcủanútđó • Bậccủamộtcây :làbậclớnnhấtcủacácnúttrongcây (sốcâycontốiđacủamộtnútthuộccây ). Câycóbậcnthìgọilàcâyn-phân. • Nútgốc :lànútkhôngcónútcha. • Nútlá :lànútcóbậcbằng 0 . • Nútnhánh :lànútcóbậckhác 0 vàkhôngphảilàgốc . • Mứccủamộtnút : • Mức (gốc (T) ) = 0. • GọiT1, T2, T3, ... , TnlàcáccâyconcủaT0 • Mức (T1) = Mức (T2) = ... = Mức (Tn) = Mức (T0) + 1. Caáu truùc Döõ lieäu - Caáu truùc caây

  8. CấutrúccâyMộtsốkháiniệmcơbản • Độdàiđườngđitừgốcđếnnútx :làsốnhánhcầnđiquakểtừgốcđếnx • Độdàiđườngđitổngcủacây : trongđóPxlàđộdàiđườngđitừgốcđếnX. • Độdàiđườngđitrungbình : PI = PT/n (nlàsốnúttrêncâyT). • Rừngcây:làtậphợpnhiềucâytrongđóthứtựcáccâylàquantrọng. Caáu truùc Döõ lieäu - Caáu truùc caây

  9. Khái niệm gốc J Cạnh nút Z A B R D Q K A F L Lá Caáu truùc Döõ lieäu - Caáu truùc caây

  10. BB-Electronic Corp. R&D Kinh doanh Taøi vuï Saûn xuaát Noäi ñòa Quoác teá TV CD Amplier Chaâu aâu Myõ Caùc nöôùc CấutrúccâyMộtsốvídụvềđốitượngcáccấutrúcdạngcây • Sơđồtổchứccủamộtcôngty Caáu truùc Döõ lieäu - Caáu truùc caây

  11. Student guide Giôùi thieäu Ñieåm Moâi tröôøng NN LT CT maãu Baøi taäp Thöïc haønh Thi CấutrúccâyMộtsốvídụvềđốitượngcáccấutrúcdạngcây • Mụclụcmộtquyểnsách Caáu truùc Döõ lieäu - Caáu truùc caây

  12. Cấutrúccây • Nhậnxét: • Trongcấutrúccâykhôngtồntạichutrình Caáu truùc Döõ lieäu - Caáu truùc caây

  13. Câynhịphân

  14. Câynhịphân • Địnhnghĩa: Câynhịphânlàcâymàmỗinútcótốiđa 2 câycon • Trongthựctếthườnggặpcáccấutrúccódạngcâynhịphân. Mộtcâytổngquátcóthểbiểudiễnthôngquacâynhịphân. Caáu truùc Döõ lieäu - Caáu truùc caây

  15. Cây con trái Cây con phải Hình ảnh một cây nhị phân Câynhịphân Caáu truùc Döõ lieäu - Caáu truùc caây

  16. Câynhịphân Figure 7.3: Binary tree structure. Caáu truùc Döõ lieäu - Caáu truùc caây

  17. Câynhịphân Figure 7.4: Skewed trees. Caáu truùc Döõ lieäu - Caáu truùc caây

  18. Câynhịphân • Câynhịphândùngđểbiểudiễnmộtbiểuthứctoánhọc: Caáu truùc Döõ lieäu - Caáu truùc caây

  19. CâynhịphânMộtsốtínhchấtcủacâynhịphân • Sốnútnằm ở mứci • Chiều cao cây h là mức cao nhất + 1. • Sốnútlá 2h-1, vớihlàchiềucaocủacây. • Chiềucaocủacâyhlog2(sốnúttrongcây). • Sốnúttrongcây 2h-1. • Đường đi (path) • Tên các node của quá trình đi từ node gốc theo các cây con đến một node nào đó. Mức Caáu truùc Döõ lieäu - Caáu truùc caây

  20. CâynhịphânBiểudiễncâynhịphânT • Câynhịphânlàmộtcấutrúcbaogồmcácphầntử (nút) đượckếtnốivớinhautheoquanhệ“cha-con”vớimỗichacótốiđa 2 con. Đểbiểudiễncâynhịphântachọnphươngphápcấpphátliênkết. Ứngvớimộtnút, tasửdụngmộtbiếnđộnglưutrữcácthôngtinsau: • Thôngtinlưutrữtạinút. • Địachỉnútgốccủacâycontráitrongbộnhớ. • Địachỉnútgốccủacâyconphảitrongbộnhớ. Caáu truùc Döõ lieäu - Caáu truùc caây

  21. Câynhịphân Caáu truùc Döõ lieäu - Caáu truùc caây

  22. Câynhịphân Để đơn giản, ta khai báo cấu trúc dữ liệu như sau : typedef struct NODE { int data; NODE* left; NODE* right; }; typedef struct NODE* TREE; TREE root; Caáu truùc Döõ lieäu - Caáu truùc caây

  23. CâynhịphânDuyệtcâynhịphân • Có3kiểuduyệtchínhcóthểápdụngtrêncâynhịphân: • Duyệttheothứtựtrước (NLR)- Preorder • Duyệttheothứtựgiữa (LNR)- Inorder • Duyệttheothứtựïsau (LRN)- Postorder • Têncủa3kiểuduyệtnàyđượcđặtdựatrêntrìnhtựcủaviệcthămnútgốcsovớiviệcthăm 2 câycon. Caáu truùc Döõ lieäu - Caáu truùc caây

  24. CâynhịphânDuyệttheothứtựtrước (Node-Left-Right) • Kiểuduyệtnàytrướctiênthămnútgốcsauđóthămcácnútcủacâycontráirồiđếncâyconphải. • Thủtụcduyệtcóthểtrìnhbàyđơngiảnnhưsau: voidNLR(TREE root) { if (Root != NULL) { <XửlýRoot>;//Xử lý tương ứng theo nhu cầu NLR(root->left); NLR(root->right); } } Caáu truùc Döõ lieäu - Caáu truùc caây

  25. CâynhịphânDuyệttheothứtựtrước (Node-Left-Right) • Mộtvídụ: đọcmộtquyểnsáchhaybàibáotừđầuđếncuốinhưminhhọatronghìnhbêndưới: Caáu truùc Döõ lieäu - Caáu truùc caây

  26. Duyệt theo thứ tự trước (Node-Left-Right) A B C D E F G H I J K L M N O P M Kết quả: A B D H I N E J O K C F L P G Caáu truùc Döõ lieäu - Caáu truùc caây

  27. Cây nhị phân Duyệt theo thứ tự giữa (Left- Node-Right) • Kiểu duyệt này trước tiên thăm các nút của cây con trái sau đó thăm nút gốc rồi đến cây con phải. • Thủ tục duyệt có thể trình bày đơn giản như sau: void LNR(TREE root) { if (root != NULL) { LNR(root->left); <Xử lý Root>; //Xử lý tương ứng theo nhu cầu LNR(root->right); } } Caáu truùc Döõ lieäu - Caáu truùc caây

  28. Duyệt theo thứ tự giữa (Left- Node-Right) A B C D E F G H I J K L M N O P G Kết quả: H D N I B J O E K A F P L C M Caáu truùc Döõ lieäu - Caáu truùc caây

  29. Cây nhị phân Duyệt theo thứ tự sau (Left-Right-Node) • Kiểu duyệt này trước tiên thăm các nút của cây con trái sau đó thăm đến cây con phải rồi cuối cùng mới thăm nút gốc. • Thủ tục duyệt có thể trình bày đơn giản như sau: void LRN(TREE root) { if (root != NULL) { LRN(root->left); LRN(root->right); <Xử lý Root>; //Xử lý tương ứng theo nhu cầu } } Caáu truùc Döõ lieäu - Caáu truùc caây

  30. Một ví dụ quen thuộc trong tin học về ứng dụng của duyệt theo thứ tự sau là việc xác định tổng kích thước của một thư mục trên đĩa Cây nhị phân Duyệt theo thứ tự sau (Left-Right-Node) Caáu truùc Döõ lieäu - Caáu truùc caây

  31. Duyệt theo thứ tự sau (Left-Right-Node) A B C D E F G H I J K L M N O P A Kết quả: H N I D O J K E B P L F M G C Caáu truùc Döõ lieäu - Caáu truùc caây

  32. (3 + 1)3/(9 – 5 + 2) – (3(7 – 4) + 6) = –13 CâynhịphânDuyệttheothứtựsau (Left-Right-Node) • Tínhtoángiátrịcủabiểuthứcdựatrêncâybiểuthức Caáu truùc Döõ lieäu - Caáu truùc caây

  33. CâynhịphânMộtcáchbiểudiễncâynhịphânkhác • Đôikhi, khiđịnhnghĩacâynhịphân, ngườitaquantâmđếncảquanhệ 2 chiềuchaconchứkhôngchỉmộtchiềunhưđịnhnghĩa ở phầntrên. • Lúcđó, cấutrúccâynhịphâncóthểđịnhnghĩalạinhưsau: typedefstructtagTNode { DataType Key; structtagTNode* pParent; structtagTNode* pLeft; structtagTNode* pRight; }TNODE; typedefTNODE *TREE; Caáu truùc Döõ lieäu - Caáu truùc caây

  34. CâynhịphânMộtcáchbiểudiễncâynhịphânkhác Caáu truùc Döõ lieäu - Caáu truùc caây

  35. Câynhịphântìmkiếm(Binary search tree)

  36. Câynhịphântìmkiếm (BST) • Địnhnghĩa: câynhịphântìmkiếm (BST) làcâynhịphântrongđótạimỗinút, khóacủanútđangxétlớnhơnkhóacủatấtcảcácnútthuộccâycontráivànhỏhơnkhóacủatấtcảcácnútthuộccâyconphải. • NếusốnúttrêncâylàNthìchiphítìmkiếmtrungbìnhchỉkhoảnglog2N. Caáu truùc Döõ lieäu - Caáu truùc caây

  37. 44 18 88 59 108 13 37 15 23 40 55 71 Câynhịphântìmkiếm Caáu truùc Döõ lieäu - Caáu truùc caây

  38. Cấu trúc dữ liệu typedef struct NODE { int data; NODE* left; NODE* right; }; typedef struct NODE* TREE; TREE root; Caáu truùc Döõ lieäu - Caáu truùc caây

  39. Các thao tác trên BST a. Khởi tạo cây BST Khởi tạo cây BST: cho con trỏ quản lý địa chỉ nút gốc về con trỏ NULL void Init(Node &root) { root = NULL; } Caáu truùc Döõ lieäu - Caáu truùc caây

  40. Các thao tác trên BST Tạo node: Node* GetNode (int x) { p= new Node; if (p != NULL) { p-> Left = NULL; p-> Right = NULL; p-> Data = x; } return (p); } Caáu truùc Döõ lieäu - Caáu truùc caây

  41. Thêm một nút vào cây BST int InsertTree(tree &root , int x) { if(root != NULL) { if(root->data==x) return 0; if(root->data>x) return InsertTree(root->letf,x); else returnInsertTree(root->right,x); } else Caáu truùc Döõ lieäu - Caáu truùc caây

  42. else { root= new node; if(root==NULL) return -1; root->data=x; root->left=root->right=NULL; return 1; } } Caáu truùc Döõ lieäu - Caáu truùc caây

  43. Tạo cây nhị phân tìm kiếm • Ta có thể tạo một cây nhị phân tìm kiếm bằng cách lặp lại quá trình thêm 1 phần tử vào một cây rỗng. void CreateTree(tree &root) { int x,n; cout<<“Nhap n = “; cin>>n; for(int i=1; i<=n;i++) { cout<<“Nhap gia tri:”; cin>>x; InsertTree(root,x); } } Caáu truùc Döõ lieäu - Caáu truùc caây

  44. Tạo cây nhị phân tìm kiếm 25 37 10 18 29 50 3 1 6 5 12 20 35 13 32 41 25 10 37 3 18 29 50 1 6 12 20 35 41 5 13 32 25 37 10 18 29 50 3 1 6 5 12 20 35 13 32 41 Caáu truùc Döõ lieäu - Caáu truùc caây

  45. Duyệtcâynhịphântìmkiếm • Thaotácduyệtcâytrêncâynhịphântìmkiếmhoàntoàngiốngnhưtrêncâynhịphân. • Lưuý: khiduyệttheothứtựgiữa, trìnhtựcácnútduyệtquasẽchotamộtdãycácnúttheothứtựtăngdầncủakhóa. Caáu truùc Döõ lieäu - Caáu truùc caây

  46. Duyệtcâynhịphântìmkiếm • Duyệt theo thứ tự trước – (Node-Left-Right): Duyệt nút gốc, duyệt cây con bên trái, duyệt cây con bên phải voidNLR(TREE root) { if (root!=NULL) { cout<<root->data<<" "; NLR(root->left); NLR(root->right); } } Caáu truùc Döõ lieäu - Caáu truùc caây

  47. Duyệtcâynhịphântìmkiếm • Duyệt theo thứ tự giữa – (Left-Node-Right): Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con bên phải voidLNR(TREE root) { if (root!=NULL) { LNR(root->left); cout<<root->data<<" "; LNR(root->right); } } Caáu truùc Döõ lieäu - Caáu truùc caây

  48. Duyệtcâynhịphântìmkiếm • Duyệt theo thứ tự sau – (Left-Right-Node): Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con bên phải voidLRN(TREE root) { if (root!=NULL) { LRN(root->left); LRN(root->right); cout<<root->data<<" "; } } Caáu truùc Döõ lieäu - Caáu truùc caây

  49. Tìmmộtphầntửxtrongcây(đệquy) • Tìmmộtphầntửxtrongcây (đệquy): NODE* searchNode(TREE root, int X) { if(root!=NULL) { if(root->data == X) return root; if(root->data > X) returnsearchNode(root->left, X); returnsearchNode(root->right, X); } returnNULL; } Caáu truùc Döõ lieäu - Caáu truùc caây

  50. Tìmmộtphầntửxtrongcây(khôngđệquy) • Tìmmộtphầntửxtrongcây (khôngđệquy): NODE * searchNode(TREE root, int x) { TNODE *p = root; while (p != NULL) { if(x == p->data) return p; else if(x < p->data) p = p->left; else p = p->right; } returnNULL; } Caáu truùc Döõ lieäu - Caáu truùc caây

More Related