BÀI TẬP NHÓM MÔN HỌC IT3040 – KỸ THUẬT LẬP TRÌNH

23 460 0
BÀI TẬP NHÓM MÔN HỌC IT3040 – KỸ THUẬT LẬP TRÌNH

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TRƯỜNG ĐẠI HỌC BÁCH KHOA BÀI HÀ TẬP LỚNPNỘI LỚNN KSTN-CNTT VIỆN CÔNG NGHỆ THÔNG dnTIN VÀ TRUYỀN THÔNG BÀI TẬT LẬP TRÌNH 2012-2013P LỚNN BÀI TẬP NHĨM MƠN HỌC IT3040 – KỸ THUẬT LẬP TRÌNH 2012-2013T LẬT LẬP TRÌNH 2012-2013P TRÌNH 2012-2013 Giảng viên hướng dẫn : PGS TS Huỳnh Quyết Thắng Nhóm học viên : Nguyễn Hồng Hải Nguyễn Văn Thiện Vũ Văn Tú Lê Anh Vũ Đỗ Quốc Đạt Lớp: KSTN_CNTT_K56 HÀ NỘI 2013 Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT MỤC LỤCC LỤC LỤCC IT3040 – KỸ THUẬT LẬP TRÌNH 2012-2013 Giảng viên hướng dẫn I : PGS TS Huỳnh Quyết Thắng GIỚNI THIỆU VÀ ỨNG DỤNG CỦA CÂY NHỊ PHÂNU VÀ ỨNG DỤNG CỦA CÂY NHỊ PHÂNNG DỤC LỤCNG CỦA CÂY NHỊ PHÂNA CÂY NHỊ PHÂN PHÂN Định nghĩa:nh nghĩa: Tính chấtt Biểu diễn nhị phân.u diễn nhị phân.n nhịnh nghĩa: phân 4 Các thao tác nhịnh nghĩa: phân: II 4.1 Cấtu trúc: 4.2 Tạo nút:o nút: 4.3 Tính số nút chiều sâu nút chiều sâu câyu sâu câya .5 4.4 Duyệt theo thứ tự trước NLR (t theo thứ tự trước NLR ( tự trước NLR ( trước NLR (c NLR ( preoder Traversal) 4.5 Duyệt theo thứ tự trước NLR (t theo thứ tự trước NLR ( tự trước NLR ( LNR (a LNR ( inoder Traversal) 4.6 Duyệt theo thứ tự trước NLR (t theo thứ tự trước NLR ( tự trước NLR ( sau LRN (postoder Traversal) Bài toán đặt rat Giớc NLR (i thiệt theo thứ tự trước NLR (u: Duyệt theo thứ tự trước NLR (t theo không dùng đệt theo thứ tự trước NLR ( quy 2.1 Thuật toán 2.1.1 Duyệt theo thứ tự 2.1.2 Duyệt theo thứ tự trước .11 2.2 Cài đặt rat 13 2.2.1 Cài đặt rat file header 13 2.2.2 Tạo nút:o thêm nút vào 15 2.2.3 Tạo nút:o luồngng .16 2.2.4 Duyệt theo thứ tự trước NLR (t nhịnh nghĩa: phân .17 2.2.5 In nhịnh nghĩa: phân 18 III TÀI LIỆU VÀ ỨNG DỤNG CỦA CÂY NHỊ PHÂNU THAM KHẢOO .24 Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT I GIỚNI THIỆU VÀ ỨNG DỤNG CỦA CÂY NHỊ PHÂNU VÀ ỨNG DỤNG CỦA CÂY NHỊ PHÂNNG DỤC LỤCNG CỦA CÂY NHỊ PHÂNA CÂY NHỊ PHÂN PHÂN Định nghĩa:nh nghĩa: 1.1 Cây Là đ th có hư ng, lien thơng khơng có chu trình Cây bao g m nút, có m ột nút đặc t nút đ ặc c biệt gọi gốc (root) cạnh nối nút.t gọi gốc (root) cạnh nối nút.i gốc (root) cạnh nối nút.c (root) cạnh nối nút.nh nốc (root) cạnh nối nút.i nút 1.2 Cây nhịnh nghĩa: phân: Là mà m i nút có nhiều (con trái phải) Mỗi nút u (con trái phải) Mỗi nút t (con trái phải) Mỗi nút i) M i nút c khơng có con, c có trái, có trái, c có trái, có phải Đỗ Quốc Đạti, c có cải Đỗ Quốc Đạt trái phải Đỗ Quốc Đạti  Cây nh phân suy biến có dạng:n có dạnh nối nút.ng:  Cây nh phân đ y đủ: nhị phân thõa mãn nút đề có độ sâu các: nh phân thõa mãn m i nút đ ều (con trái phải) Mỗi nút có đ ột nút đặc sâu nút có  Cây nh phân hoàn chỉnh : nhị phân mà nút mức trừ mức cuối đạtnh : nh phân mà nút mức trừ mức cuối đạt mức trừ mức cuối đạtc trừ mức cuối đạt m ức trừ mức cuối đạtc cu ốc (root) cạnh nối nút.i đ ều (con trái phải) Mỗi nút u đ ạnh nối nút.t tốc (root) cạnh nối nút.i đa Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT Cây hoàn chỉnhnh Cây đầy đủy đủa Tính chấtt  Sốc (root) cạnh nối nút lượng nút tối đa mức i nhị phân 2ng nút tốc (root) cạnh nối nút.i đa mức trừ mức cuối đạtc i củ: nhị phân thõa mãn nút đề có độ sâu cáca nh phân i-1, tốc (root) cạnh nối nút.i thiểu (u (i≥1)  Một nút đặc t nh phân chiều (con trái phải) Mỗi nút u cao h có khơng q 2k-1 nút, k≥1  Một nút đặc t nh phân có n nút có chiều (con trái phải) Mỗi nút u cao tốc (root) cạnh nối nút.i thiểu (u [log 2(n+1)] Biểu diễn nhị phân.u diễn nhị phân.n nhịnh nghĩa: phân  Biểu (u diễn mảng:n mảng:ng mải) Mỗi nút ng: V i nh phân đ y đủ: nhị phân thõa mãn nút đề có độ sâu các, ta đánh sốc (root) cạnh nối nút nút từ mức cuối đạt trở mức trừ mức cuối đạt đi, hến có dạng:t mức trừ mức cuối đạtc đến có dạng:n mức trừ mức cuối đạtc khác, t mức cuối đạt trái qua phải) Mỗi nút i Dùng mải) Mỗi nút ng V lưu trữ nhị phân , nút thứ i lưu trữ phần tử V(i) nh phân , nút th ức trừ mức cuối đạt i củ: nhị phân thõa mãn nút đề có độ sâu cáca đượng nút tối đa mức i nhị phân 2c lưu trữ nhị phân , nút thứ i lưu trữ phần tử V(i) mức trừ mức cuối đạt ph n t V(i) V(i) • Ví dụ với đày đủ lưu trữ sau: v i đày đủ: nhị phân thõa mãn nút đề có độ sâu mức trừ mức cuối đạt đượng nút tối đa mức i nhị phân 2c lưu trữ nhị phân , nút thứ i lưu trữ phần tử V(i) sau:  Biểu (u diễn mảng:n mảng:ng trỏ:: Trong cách lưu trữ nhị phân , nút thứ i lưu trữ phần tử V(i) , m i nút ức trừ mức cuối đạtng v i nút đặc t ph n tử V(i) nh có quy cách sau: LPTR INFO RPTR LPTR : Con trỏ: trỏ: t i trái củ: nhị phân thõa mãn nút đề có độ sâu cáca nút RPTR : Con trỏ: trỏ: t i phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca nút INFO : Trường thông tin.ng thông tin Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT • Ví dụ với đày đủ lưu trữ sau: nh phân sau đây: Các thao tác nhịnh nghĩa: phân: 4.1 Cấtu trúc: typedef struct TreeNode { char key[20]; struct TreeNode *lChild; struct TreeNode *rChild; }TreeNode; 4.2 Tạo nút:o nút: TreeNode *getNode(char *key){ TreeNode *tempNode; tempNode=(TreeNode*)malloc(sizeof(TreeNode)); tempNode->lChild=NULL; tempNode->rChild=NULL; tempNode->key=key; return tempNode; } 4.3 Tính số nút chiều sâu nút chiều sâu câyu sâu câya int countNode(TreeNode *root){ if(root==NULL) return 0; else{ int ld=countNode(root->lChild); int rd=countNode(root->rChild); Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT return 1+ld+rd; } } 4.4 Duyệt theo thứ tự trước NLR (t theo thứ tự trước NLR ( tự trước NLR ( trước NLR (c NLR ( preoder Traversal) Void printPreoder(TreeNode *root){ if(root!=NULL){ printf(“%s\n”,root->key); printPreoder(root->lChild); printPreoder(root->rChild); } } 4.5 Duyệt theo thứ tự trước NLR (t theo thứ tự trước NLR ( tự trước NLR ( LNR (a LNR ( inoder Traversal) Void printInoder(TreeNode *root){ if(root!=NULL){ printInoder(root->lChild); printf(“%s\n”,root->key); printInoder(root->rChild); } } 4.6 Duyệt theo thứ tự trước NLR (t theo thứ tự trước NLR ( tự trước NLR ( sau LRN (postoder Traversal) void printPostoder(TreeNode *root){ if(root!=NULL){ printPostoder(root->lChild); printPostoder(root->rChild); printf(“%s\n”,root->key); } } Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT II Bài toán đặt rat Giớc NLR (i thiệt theo thứ tự trước NLR (u: Nến có dạng:u nút đặc t nút nút đặc t nh phân c trái c khơng có ph ải) Mỗi nút i ho ặc c nút trỏ: trái c phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca nút có giá tr NULL Một nút đặc t cách tránh trỏ: NULL sử V(i) dụ với đày đủ lưu trữ sau:ng trỏ: thay chức trừ mức cuối đạta giá tr NULL trỏ: đến có dạng:n nút cao nút n nút tổ tiên tiên Một nút đặc t ví dụ với đày đủ lưu trữ sau: cho thao tác việt gọi gốc (root) cạnh nối nút.c cài đặc t threaded binary tree, nh phân mà nút chức trừ mức cuối đạta trỏ: NULL đượng nút tối đa mức i nhị phân 2c trỏ: đến có dạng:n inorder predecessor(nút trư c nút xét thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a c trỏ: đến có dạng:n inorder sucecssor(nút sau thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a) Bằng mảng:ng cách này, có thểu ( duyệt gọi gốc (root) cạnh nối nút.t mà không c n dùng đệt gọi gốc (root) cạnh nối nút quy Cất (con trái phải) Mỗi nút u trúc củ: nhị phân thõa mãn nút đề có độ sâu cáca khác nút đặc t chút so v i nh phân: typedef struct TreeNode { char key; struct TreeNode *lChild; struct TreeNode *rChild; int lFlag;//TRUE neu lChild tro toi con, FALSE neu toi thread int rFlag;//TRUE neu rChild tro toi con, FALSE neu toi thread }TreeNode; Xét nh phân hình bên: (Các luồng liên kết đặc biệt thể ng liên kết đặc biệt thể t đặc biệt thể c biện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtt thể hiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn mũi tên đứt.)ng mũi tên đứt.)t.) Khi duyệt gọi gốc (root) cạnh nối nút.t theo thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a ta đượng nút tối đa mức i nhị phân 2c: Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT Ta xét tiến có dạng:p ví dụ với đày đủ lưu trữ sau:: Chuyểu (n nh phân sau thành TBT: Duyệt gọi gốc (root) cạnh nối nút.t theo thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a: DBAEC Vì TBT tương ứng:y TBT tươn nút ng ức trừ mức cuối đạtng: B khơng có phải) Mỗi nút i TBT tương ứng:y có nút đặc t lu ng trỏ: đến có dạng:n A nút inorder successor Tươn nút ng tự trỏ đến nút D E Nút C khơng có phải) Mỗi nút i khơng có nút inorder successor đểu ( trỏ: t i TBT tương ứng:y có nút đặc t lu ng khơng trỏ: đến có dạng:n đâu Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT Duyệt theo thứ tự trước NLR (t theo không dùng đệt theo thứ tự trước NLR ( quy 2.1 Thuật toán.t toán 2.1.1 Duyệt theo thứ tự trước NLR (t theo thứ tự trước NLR ( tự trước NLR ( LNR (a Bư c 1: Tạnh nối nút.i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i, tìm nút P trư c thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a Nến có dạng:u P khơng có phải) Mỗi nút i P->rChild đượng nút tối đa mức i nhị phân 2c sử V(i).a lạnh nối nút.i đểu ( trỏ: đến có dạng:n nút hi ệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i Bư c 2: Từ mức cuối đạt nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i, gán currentNode=currentNode->lChild (rẽ trái) hến có dạng:t mức trừ mức cuối đạtc có thểu (, m i l n chuyểu (n nút lạnh nối nút.i gọi gốc (root) cạnh nối nút.i đến có dạng:n hàm mức trừ mức cuối đạt bư c đ ểu ( tìm threads Bư c 3: In nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i, nút không thểu ( rẽ trái đượng nút tối đa mức i nhị phân 2c nữ nhị phân , nút thứ i lưu trữ phần tử V(i).a bư c Bư c 4: Tạnh nối nút.i nút vừ mức cuối đạta in ra, kiểu (m tra rChild thậy TBT tương ứng:t trỏ đến hay thread N ến có dạng:u thread, gán currentNode=currentNode->rChild in nút Nến có dạng:u thự trỏ đến c trỏ đến , gán currentNode=currentNode->rChild Xét ví dụ trên: trên: Bư c Tạnh nối nút.i nút A, ta tìm đượng nút tối đa mức i nhị phân 2c B nút sau A thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a, ta sử V(i).a lạnh nối nút.i trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca B đến có dạng:n A Bư c Rẽ trái qua B, sử V(i).a lạnh nối nút.i trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca D, rẽ trái tiến có dạng:p đến có dạng:n D Bư c D khơng có trái, khơng rẽ tiến có dạng:p đượng nút tối đa mức i nhị phân 2c nữ nhị phân , nút thứ i lưu trữ phần tử V(i).a,in raD D Bư c Kiểu (m tra trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca D không thự trỏ đến c B trỏ đến nên ta gán lạnh nối nút.i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i B in B Bư c Kiểu (m tra trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca B khơng thự trỏ đến c A trỏ đến nên ta gán lạnh nối nút.i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i A in A Bư c Kiểu (m tra trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca A thự trỏ đến c trỏ đến nên Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt ta gán lạnh nối nút.i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i C quay lạnh nối nút.i bư c v i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i C Bư c Rẽ trái hến có dạng:t mức trừ mức cuối đạtc đến có dạng:n E In E E Bư c Con trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca E chỉnh : nhị phân mà nút mức trừ mức cuối đạt đến có dạng:n NULL nên ta kến có dạng:t thúc void Page BÀI TẬP LỚNP LỚNN KSTN-CNTT inorder(TreeNode *root){ TreeNode *currentNode, *tempNode; currentNode=root; while(currentNode!=NULL){ /*Nut cuoi cung thu tu giua se co *rChild bang NULL va sau lastNode->rChild vong lap ket thuc*/ tempNode=findInorderPre(currentNode); /*Tim nut nhan currentNode lam right thread, gan lai rChild cua nut do*/ /*Re trai lien tuc den gap nut khong co trai thi in ra*/ while(currentNode->lFlag==TRUE&¤tNode->lChild!=NULL){ currentNode=currentNode->lChild; tempNode=findInorderPre(currentNode); } printf("%c ",currentNode->key); /*Chung nao rChild la thread thi in ra*/ while(currentNode->rFlag==FALSE&¤tNode->rChild!=NULL) { currentNode=currentNode->rChild; printf("%c ",currentNode->key); } /*Neu rChild chi den thuc su thi re phai*/ currentNode=currentNode->rChild; } halt();//Dung man hinh } 2.1.2 Duyệt theo thứ tự trước NLR (t theo thứ tự trước NLR ( tự trước NLR ( trước NLR (c Bư c 1: Tạnh nối nút.i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i, tìm nút P trư c thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a Nến có dạng:u P khơng có phải) Mỗi nút i P->rChild đượng nút tối đa mức i nhị phân 2c sử V(i).a lạnh nối nút.i đểu ( trỏ: đến có dạng:n nút hi ệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i In nút hi ệt gọi gốc (root) cạnh nối nút.n t ạnh nối nút.i Bư c 2: Từ mức cuối đạt nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i, gán currentNode=currentNode->lChild (rẽ trái) hến có dạng:t mức trừ mức cuối đạtc có thểu (, m i l n chuyểu (n nút lạnh nối nút.i gọi gốc (root) cạnh nối nút.i đến có dạng:n hàm mức trừ mức cuối đạt bư c đ ểu ( tìm threads đ ng thờng thơng tin.i in nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 10 BÀI TẬP LỚNP LỚNN KSTN-CNTT Bư c 3: Tạnh nối nút.i nút không thểu ( rẽ trái đượng nút tối đa mức i nhị phân 2c nữ nhị phân , nút thứ i lưu trữ phần tử V(i).a, kiểu (m tra rChild thậy TBT tương ứng:t s ự trỏ đến hay thread Nến có dạng:u thread, gán currentNode=currentNode->rChild Nến có dạng:u thự trỏ đến c trỏ đến , gán currentNode=currentNode->rChild r i quay lai bư c Xét ví dụ trên: trên: Bư c Bư c Bư c Bư c Bư c Bư c Bư c Bư c Bư c Tạnh nối nút.i nút A, ta tìm đượng nút tối đa mức i nhị phân 2c B nút sau A thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a, ta sử V(i).a lạnh nối nút.i trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca B đến có dạng:n A In A Rẽ trái qua B, sử V(i).a lạnh nối nút.i trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca D, rẽ trái tiến có dạng:p đến có dạng:n D In B D khơng có trái, khơng rẽ tiến có dạng:p đượng nút tối đa mức i nhị phân 2c nữ nhị phân , nút thứ i lưu trữ phần tử V(i).a In raD Kiểu (m tra trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca D không thự trỏ đến c trỏ đến nên ta gán lạnh nối nút.i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i B Kiểu (m tra trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca B khơng thự trỏ đến c trỏ đến nên ta gán lạnh nối nút.i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i A Kiểu (m tra trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca A thự trỏ đến c trỏ đến nên ta gán lạnh nối nút.i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i C quay lạnh nối nút.i bư c v i nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i C In C Rẽ trái đến có dạng:n E In E Con trỏ: phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca E chỉnh : nhị phân mà nút mức trừ mức cuối đạt đến có dạng:n NULL, ta kến có dạng:t thúc A B void D C E preorder(TreeNode *root){ Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 11 BÀI TẬP LỚNP LỚNN KSTN-CNTT TreeNode *currentNode, *tempNode; currentNode=root; while(currentNode!=NULL){ /*Nut cuoi cung thu tu giua se co *rChild bang NULL va sau lastNode->rChild vong lap ket thuc*/ tempNode=findInorderPre(currentNode); /*Tim nut nhan currentNode lam right thread,gan lai rChild cua nut do*/ /*In nut hien tai, re trai het muc co the, di den dau in den do*/ printf("%c ",currentNode->key); while(currentNode->lFlag==TRUE&¤tNode->lChild!=NULL){ currentNode=currentNode->lChild; tempNode=findInorderPre(currentNode); printf("%c ",currentNode->key); } /*Chung nao rChild la thread thi nhay theo thread nhung khong in*/ while(currentNode->rFlag==FALSE&¤tNode->rChild!=NULL){ currentNode=currentNode->rChild; } /*Neu rChild chi den thuc su thi re phai*/ currentNode=currentNode->rChild; } Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 12 BÀI TẬP LỚNP LỚNN KSTN-CNTT halt(); } 2.2 Cài đặt rat Thao tác cài đặc t g m có : -2 File header TreeNode.h : khai báo cất (con trái phải) Mỗi nút u trúc nhị phân , nút thứ i lưu trữ phần tử V(i) liệt gọi gốc (root) cạnh nối nút.u củ: nhị phân thõa mãn nút đề có độ sâu cáca nút funclist.h : khai báo t ất (con trái phải) Mỗi nút t c ải) Mỗi nút hàm đ ượng nút tối đa mức i nhị phân 2c s V(i) d ụ với đày đủ lưu trữ sau:ng project -File createtree.cpp dùng đểu ( tạnh nối nút.o -File menu.cpp đưa giao diệt gọi gốc (root) cạnh nối nút.n sử V(i) dụ với đày đủ lưu trữ sau:ng -File makethreads.cpp chuyểu (n đổ tiên.i có trỏ: null thành khơng cịn tr ỏ: null -File traversals.cpp có tác dụ với đày đủ lưu trữ sau:ng duyệt gọi gốc (root) cạnh nối nút.t sau chuyểu (n đổ tiên.i -File printtree.cpp dùng in sau m i l n nhậy TBT tương ứng:p đểu ( ngường thông tin.i sử V(i) d ụ với đày đủ lưu trữ sau:ng d ễn mảng: hình dung cho thao tác nhậy TBT tương ứng:p -File main.cpp file chức trừ mức cuối đạta chươn nút ng trình củ: nhị phân thõa mãn nút đề có độ sâu cáca project 2.2.1 Cài đặt rat file header TreeNode.h Cài đặc t cất (con trái phải) Mỗi nút u trúc nhị phân , nút thứ i lưu trữ phần tử V(i) liệt gọi gốc (root) cạnh nối nút.u TreeNode cho nút cây, g m tr ường thông tin.ng :  Char key; kiểu (u nhị phân , nút thứ i lưu trữ phần tử V(i) liệt gọi gốc (root) cạnh nối nút.u lưu trữ nhị phân , nút thứ i lưu trữ phần tử V(i) m i nút  TreeNode *lChild; trỏ: trỏ: vều (con trái phải) Mỗi nút trái củ: nhị phân thõa mãn nút đề có độ sâu cáca nút cha  TreeNode *rChild; trỏ: trỏ: vều (con trái phải) Mỗi nút phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca nút cha  Int lFlag; có giá tr mảng:ng TRUE nến có dạng:u có trỏ: lChild chỉnh : nhị phân mà nút mức trừ mức cuối đạt đ ến có dạng:n con, FALSE nến có dạng:u t i lu ng;  Int rFlag; có giá tr mảng:ng TRUE nến có dạng:u có trỏ: rChild chỉnh : nhị phân mà nút mức trừ mức cuối đạt đ ến có dạng:n con, FALSE nến có dạng:u t i lu ng; Các trư ng lFlag rFlag dùng thay cho việc xét trái null hay c xét trái null hay Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 13 BÀI TẬP LỚNP LỚNN KSTN-CNTT ph i null sau chuyển đổi khơng trỏ trỏ đến nút n đổi khơng cịn trỏ trỏ đến nút i khơng cịn tr ỏ trỏ đến nút tr ỏ trỏ đến nút đ ến nút n nút null nữa.a #define TRUE #define FALSE typedef struct TreeNode { char key; struct TreeNode *lChild; struct TreeNode *rChild; int lFlag;//TRUE neu lChild tro toi con, FALSE neu toi thread int rFlag;//TRUE neu rChild tro toi con, FALSE neu toi thread }TreeNode; funtlist.h Chức trừ mức cuối đạta hàm đượng nút tối đa mức i nhị phân 2c sử V(i) dụ với đày đủ lưu trữ sau:ng project TreeNode *getNode(char key);\\ Tạo nút từ ký tự TreeNode *findInorderPre(TreeNode *node);\\ Tìm nút đứng trước duyệt theo thứ tự TreeNode *findInorderSuc(TreeNode *node);\\ Tìm nút đứng sau duyệt theo thứ tự void inorder(TreeNode *root);\\ Duyệt theo thứ thự void preorder(TreeNode *root);\\ Duyệt theo thứ thự trước void postorder(TreeNode *root);\\ Duyệt theo thứ thự sau void insert(TreeNode *r,TreeNode *temp);\\ Chèn nút temp vào r void insertTree(TreeNode **root);\\ int heading(); int menu(); void halt(); void nothingInput(); int getData(); void gotoxy(int x, int y); int wherex(); int wherey(); void cls(); int drawNode(char value,int &x,int &y,int &l,int type,int position); void printTree(TreeNode *root,int px,int py,int pl,int t_node); Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 14 BÀI TẬP LỚNP LỚNN KSTN-CNTT 2.2.2 Tạo nút:o thêm nút vào File dùng việt gọi gốc (root) cạnh nối nút.c nhậy TBT tương ứng:p kí tự trỏ đến từ mức cuối đạt bàn phím đểu ( tạnh nối nút.o nút chèn vào G m có hàm: void insert(TreeNode*r,TreeNode*temp),void insertTree(TreeNode **root); insert(TreeNode*r,TreeNode*temp) Hàm có nhiệt gọi gốc (root) cạnh nối nút.m vụ với đày đủ lưu trữ sau: chọi gốc (root) cạnh nối nút.n xem nút in vào đượng nút tối đa mức i nhị phân 2c in vào v trí thến có dạng: so v i gốc (root) cạnh nối nút.c Ví dụ với đày đủ lưu trữ sau: nến có dạng:u gốc (root) cạnh nối nút.c nút a ta chọi gốc (root) cạnh nối nút.n thêm vào nút b ch ươn nút ng trình h ỏ:i bạnh nối nút.n muốc (root) cạnh nối nút.n thêm vào bên trái hay phải) Mỗi nút i củ: nhị phân thõa mãn nút đề có độ sâu cáca nút a Sau chọi gốc (root) cạnh nối nút.n xong in cho ta theo dõi insertTree(TreeNode**root) Hàm có nhiệt gọi gốc (root) cạnh nối nút.m vụ với đày đủ lưu trữ sau: yêu c u nhậy TBT tương ứng:p kí tự trỏ đến đểu ( tạnh nối nút.o nút thêm vào Sau nhậy TBT tương ứng:p xong kí tự trỏ đến chươn nút ng trình hỏ:i bạnh nối nút.n có muốc (root) cạnh nối nút.n nhậy TBT tương ứng:p tiến có dạng:p hay khơng, n ến có dạng:u nhậy TBT tương ứng:p kí tự trỏ đến ‘y’ chươn nút ng trình cho nhậy TBT tương ứng:p thêm cịn nến có dạng:u ‘n’ chươn nút ng trình in Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 15 BÀI TẬP LỚNP LỚNN KSTN-CNTT 2.2.3 Tạo nút:o luồngng Ý tưởng ng Cách tìm nút đức trừ mức cuối đạtng trư c nút P thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a TH1:Nến có dạng:u nút P có trái, ta đến có dạng:n trái r i từ mức cuối đạt rẽ phải) Mỗi nút i ch mức cuối đạtng nút hi ệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i v%n có phải) Mỗi nút i (rflag=TRUE), nút c n tìm nút hiệt gọi gốc (root) cạnh nối nút.n tạnh nối nút.i Tóm lạnh nối nút.i, nút c n tìm nút phải) Mỗi nút i (con trái phải) Mỗi nút t củ: nhị phân thõa mãn nút đề có độ sâu cáca trái Ta gán lạnh nối nút.i currentNode->right=P TreeNode *findInorderPre(TreeNode *node){ TreeNode *tempNode; if(node->lFlag==FALSE) return node->lChild; else{ tempNode=node->lChild; while(tempNode->rFlag==TRUE){ tempNode=tempNode->rChild; } tempNode->rChild=node; return tempNode; } } TH2: Nến có dạng:u nút P khơng có trái (lflag=FALSE), trỏ: left phải) Mỗi nút i trỏ: đ ến có dạng:n nút trư c nút P thức trừ mức cuối đạt tự trỏ đến giữ nhị phân , nút thứ i lưu trữ phần tử V(i).a Trong trình duyệt gọi gốc (root) cạnh nối nút.t nút tổ tiên tiên c ủ: nhị phân thõa mãn nút đề có độ sâu cáca P, t n tạnh nối nút.i nút làm thao tác gán lạnh nối nút.i trỏ: left củ: nhị phân thõa mãn nút đề có độ sâu cáca P.Vì TBT tương ứng:y kến có dạng:t quải) Mỗi nút P->left: TreeNode *findInorderSuc(TreeNode *node){ TreeNode *tempNode; if(node->rFlag==FALSE) return node->rChild; else{ tempNode=node->rChild; while(tempNode->lFlag==TRUE){ tempNode=tempNode->lChild; } tempNode->lChild=node; return tempNode; } } Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 16 BÀI TẬP LỚNP LỚNN KSTN-CNTT 2.2.4 Duyệt theo thứ tự trước NLR (t nhịnh nghĩa: phân void inorder(TreeNode *root){ TreeNode *currentNode, *tempNode; currentNode=root; while(currentNode!=NULL){/*Nut cuoi cung thu tu giua se co *rChild bang NULL va sau currentNode->rChild vong lap ket thuc*/ tempNode=findInorderPre(currentNode);/*Tim nut nhan currentNode lam right thread, gan lai rChild cua nut do*/ /*Re trai lien tuc den gap nut khong co trai thi in ra*/ while(currentNode->lFlag==TRUE&¤tNode->lChild!=NULL){ currentNode=currentNode->lChild; tempNode=findInorderPre(currentNode); } printf("%c ",currentNode->key); /*Chung nao rChild la thread thi in ra*/ while(currentNode->rFlag==FALSE&¤tNode->rChild!=NULL) { currentNode=currentNode->rChild; printf("%c ",currentNode->key); } /*Neu rChild chi den thuc su thi re phai*/ currentNode=currentNode->rChild; } halt(); } void preorder(TreeNode *root){ TreeNode *currentNode, *tempNode; currentNode=root; while(currentNode!=NULL){/*Nut cuoi cung thu tu giua se co *rChild bang NULL va sau currentNode->rChild vong lap ket thuc*/ tempNode=findInorderPre(currentNode);/*Tim nut nhan currentNode lam right thread, gan lai rChild cua nut do*/ /*In nut hien tai roi re trai het muc co the, di den dau in den do*/ printf("%c ",currentNode->key); while(currentNode->lFlag==TRUE&¤tNode->lChild!=NULL){ currentNode=currentNode->lChild; Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 17 BÀI TẬP LỚNP LỚNN KSTN-CNTT tempNode=findInorderPre(currentNode); printf("%c ",currentNode->key); } /*Chung nao rChild la thread thi nhay theo thread nhung khong in*/ while(currentNode->rFlag==FALSE&¤tNode->rChild!=NULL){ currentNode=currentNode->rChild; } /*Neu rChild chi den thuc su thi re phai*/ currentNode=currentNode->rChild; } halt(); } void postorder(TreeNode *root){ if(root->lFlag==TRUE&&root->lChild!=NULL) postorder(root->lChild); if(root->rFlag==TRUE&&root->rChild!=NULL) postorder(root->rChild); printf("%c ",root->key); } 2.2.5 In nhịnh nghĩa: phân Ý tưởng ng: Việt gọi gốc (root) cạnh nối nút.c in nh phân hình c n thểu ( hiệt gọi gốc (root) cạnh nối nút.n rõ đượng nút tối đa mức i nhị phân 2c mốc (root) cạnh nối nút.i quan h ệt gọi gốc (root) cạnh nối nút gi ữ nhị phân , nút thứ i lưu trữ phần tử V(i).a nút Giải) Mỗi nút sử V(i) ta biểu (u diễn mảng:n đượng nút tối đa mức i nhị phân 2c nút hình nút n ằng mảng:m t ạnh nối nút.i v trí (x,y) hình Khi đó, nến có dạng:u nút có trái ta biểu (u di ễn mảng:n cho v trí nút trái root->lChild nằng mảng:m lệt gọi gốc (root) cạnh nối nút.ch so v i nút cha khoải) Mỗi nút ng cách offset nằng mảng:m thất (con trái phải) Mỗi nút p nút n nút cha Giải) Mỗi nút sử V(i) ta có thểu ( có toạnh nối nút đột nút đặc nút trái (x-offset,y-1) Tươn nút ng tự trỏ đến , nút phải) Mỗi nút i có tọi gốc (root) cạnh nối nút.a đột nút đặc (x+offset,y-1) Dùng đệt gọi gốc (root) cạnh nối nút quy ta lạnh nối nút.i coi nút trái (hoặc c phải) Mỗi nút i) nút xét đệt gọi gốc (root) cạnh nối nút quy in củ: nhị phân thõa mãn nút đề có độ sâu cáca có dạng:n nút đượng nút tối đa mức i nhị phân 2c xuất (con trái phải) Mỗi nút t hến có dạng:t Ta sử V(i) d ụ với đày đủ lưu trữ sau:ng hàm gotoxy(x,y) đểu ( trỏ: trỏ: đến có dạng:n tọi gốc (root) cạnh nối nút.a đột nút đặc (x,y) hình, từ mức cuối đạt in nút Tạnh nối nút.o thêm hàm wherex() v trí cột nút đặc t trỏ: đức trừ mức cuối đạtng, wherey() v trí hàng trỏ: đ ức trừ mức cuối đạtng Do Dev C++ khơng có hàm gotoxy(x,y),wherex(), wherey()nên ta c n đ nh nghĩa lạnh nối nút.i hàm void gotoxy(int x,int y) { HANDLE hStdout = GetStdHandle (STD_OUTPUT_HANDLE); Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 18 BÀI TẬP LỚNP LỚNN KSTN-CNTT COORD position = {x, y}; SetConsoleCursorPosition (hStdout, position); } int wherex(){ CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo (GetStdHandle (STD_OUTPUT_HANDLE), &csbi); return csbi.dwCursorPosition.X; } int wherey(){ CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); return csbi.dwCursorPosition.Y; } Đểu ( tiến có dạng:n hành vẽ cây, từ mức cuối đạt ý tưở mức trừ mức cuối đạtng xây dự trỏ đến ng, ta viến có dạng:t hàm vẽ nút drawNode hàm printTree đểu ( in // Vẽ nút int drawNode(char value,int &x,int &y,int &l,int type,int position){ switch(position){ case LEFT:{ y=y+4; x=x-2-l; break; } case RIGHT:{ x=x+2+l; y=y+4; break; } Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 19 BÀI TẬP LỚNP LỚNN KSTN-CNTT default: break; } l=l/2; gotoxy(x,y);printf("|"); gotoxy(x,y+1);printf("|"); gotoxy(x-1,y+2);printf(" -"); gotoxy(x-2,y+3);printf("|%3c|",value); gotoxy(x-1,y+4);printf(" -"); if (type==LEFT||type==FULL){ gotoxy(x-2-l,y+3); for(int i=0;ilFlag==TRUE){ drawNode(root->key,px,py,pl,FULL,t_node); } else drawNode(root->key,px,py,pl,RIGHT,t_node); } Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 20 ... Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT II Bài. .. ng trình in Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page 15 BÀI TẬP... Nguy n Văn Thiện – Lê Anh Vũ – Vũ Văn Tú – Nguyễn Hoàng Hải Đỗ Quốc Đạtn – Lê Anh Vũ – Vũ Văn Tú – Nguy n Hoàng H ải Đỗ Quốc Đạti Đỗ Quốc Đạt Qu ốc Đạtc Đạtt Page BÀI TẬP LỚNP LỚNN KSTN-CNTT

Ngày đăng: 27/03/2015, 11:05

Từ khóa liên quan

Mục lục

  • IT3040 – KỸ THUẬT LẬP TRÌNH 2012-2013

    • Giảng viên hướng dẫn : PGS. TS. Huỳnh Quyết Thắng

      • 2.1 Thuật toán.

      • 2.1.1 Duyệt theo thứ tự giữa

      • 2.1.2 Duyệt theo thứ tự trước

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan