intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Chương 5: Cấu trúc dữ liệu Cây (tree)

Chia sẻ: Lê Trang | Ngày: | Loại File: DOC | Số trang:52

118
lượt xem
26
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Định nghĩa và khái niệm Cây là một tập hợp hữu hạn các node có cùng chung một kiểu dữ liệu, trong đó có một node đặc biệt gọi là node gốc (root).

Chủ đề:
Lưu

Nội dung Text: Chương 5: Cấu trúc dữ liệu Cây (tree)

  1. CHƯƠNG 5 CẤU TRÚC DỮ LIỆU CÂY (TREE) 5.1- Định nghĩa và khỏi niệm Cõy là một tập hợp hữu hạn cỏc node cú cựng chung một kiểu dữ liệu, trong đú cú một node đặc biệt gọi là node gốc (root). Giữa cỏc node cú một quan hệ phõn c ấp gọi là “quan hệ cha con”. Cú thể định nghĩa một cỏch đệ qui về cõy như sau: • Một node là một cõy. Node đú cũng là gốc (root) của cõy ấy. • Nếu n là một node và T1, T2, . .., Tk là cỏc cõy với n1, n2, . . , nk lần lượt là gốc thỡ một cõy mới T sẽ được tạo lập bằng cỏch cho node n trở thành cha của c ỏc node n1, n2, . . , nk hay node n trở thành gốc và T1, T2, . ., Tk là cỏc cõy con (subtree) của gốc. Vớ dụ: cấu trỳc tổ chức thư mục (directory) của dos là một cấu trỳc cõy. 5 5. 5. 5. 5. 1 2 3 4 5.1. 5.1. 5.3. 5.3. 5.4. 5.4. 1 2 1 2 1 2 Hỡnh 5.1- Vớ dụ về một cõy thư mục Một cõy được gọi là rỗng nếu nú khụng cú bất kỳ một node nào. Số cỏc node con của một node được gọi là cấp (degree) của node đú. Vớ dụ: trong cõy 5.2 sau, cấp c ủa node A là 3, cấp của node B là 2, cấp của node D là 3, cấp của node H là 2. A B C D E F G H I J K 193
  2. Node cú cấp bằng 0 được gọi là lỏ (leaf) hay node tận cựng (terminal node). Vớ dụ: cỏc node E, F, C, G, I, J, K được gọi là lỏ. Node khụng là l ỏ đ ược gọi là node trung gian hay node nhỏnh (branch node). Vớ dụ node B, D, H là cỏc node nhỏnh. Cấp cao nhất của node trờn cõy gọi là cấp của cõy, trong trường hợp cõy trong hỡnh 5.2 cấp của cõy là 3. Gốc của cõy cú số mức là 1. Nếu node cha cú số mức là i thỡ node con cú số mức là i+1. Vớ dụ gốc A cú số mức là 1, D cú số mức là 2, G cú số mức là 3, j cú số mức là 4. Chiều cao (height) hay chiều sõu (depth) của một cõy là số mức lớn nhất của node trờn cõy đú. Cõy 5.2 cú chiều cao là 4. Đường đi từ node n1 đến nk là dóy cỏc node n1, n2, . ., nk sao cho ni là node cha của node ni+1 (1
  3. Hỡnh 5.3 cỏc cõy nhị phõn A A A B B B C D C D C D E E E Cỏc cõy nhị phõn cú dạng đặc biệt bao gồm: • Cõy nhị phõn lệch trỏi (hỡnh 5.4a): là cõy nhị phõn chỉ cú cỏc node bờn trỏi. • Cõy nhị phõn lệnh phải (hỡnh 5.4b): là cõy chỉ bao gồm cỏc node phải. • Cõy nhị phõn zic zắc (hỡnh 5.4 c, 5.4d): node trỏi và node phải của cõy đan xen nhau thành một hỡnh zic zắc. • Cõy nhị phõn hoàn chỉnh ( strictly binary tree: hỡnh 5.4e) : Một cõy nhị phõn được gọi là hoàn chỉnh nếu như node gốc và tất cả cỏc node trung gian đều cú hai con. • Cõy nhị phõn đầy đủ (complete binary tree : hỡnh 5.4f): Một cõy nhị phõn được gọi là đầy đủ với chiều sõu d thỡ nú phải là cõy nhị phõn hoàn chỉnh và tất cả cỏc node lỏ đều cú chiều sõu là d. 195
  4. Hỡnh 5.4a Hỡnh 5.4b Hỡnh 5.4c Hỡnh 5.4d A A A A B B B B C C C C D D D D E E E E Hỡnh 5.4 e Hỡnh 5.4f A A B C B C D E F G D E F G H I • Cõy nhị phõn hoàn toàn cõn bằng (hỡnh 5.5): là cõy nhị phõn mà ở tất cả cỏc node của nú số node trờn nhỏnh cõy con bờn trỏi và số node trờn nhỏnh cõy con bờn phải chờnh lệnh nhau khụng quỏ 1. Nếu ta gọi Nl là số node của nhỏnh cõy con bờn trỏi và Nr là số node của nhỏnh cõy con bờn phải, khi đú cõy nhị phõn hoàn toàn cõn bằng chỉ cú thể ở một trong 3 trường hợp: • Số node nhỏnh cõy con bờn trỏi bằng số node nhỏnh cõy con bờn phải bằng N l = Nr (hỡnh 5.5a). • Số node nhỏnh cõy con bờn trỏi bằng số node nhỏnh cõy con bờn phải cộng 1 Nl = Nr+1(hỡnh 5.5b) • Số node nhỏnh cõy con bờn trỏi bằng số node nhỏnh cõy con bờn phải trừ 1 N l = Nr-1 (hỡnh 5.5c). 196
  5. Hỡnh 5.5a Bỡnh 5.5b Hỡnh 5.5c A A A B C B C B C D F E E D E F D • Cõy nhị phõn tỡm kiếm: là một cõy nhị phõn hoặc bị rỗng hoặc tất cả cỏc node trờn cõy thỏa món điều kiện sau: • Nội dung của tất cả cỏc node thuộc nhỏnh cõy con bờn trỏi đều nhỏ hơn nội dung của node gốc. • Nội dung của tất cả cỏc node thuộc nhỏnh cõy con bờn phải đều lớn hơn nội dung của node gốc. • Cõy con bờn trỏi và cõy con bờn phải cũng tự nhiờn hỡnh thành hai cõy nhị phõn tỡm kiếm. Hỡnh 5.6- vớ dụ về cõy nhị phõn tỡm kiếm 1 1 2 0 0 0 9 1 1 3 9 2 0 8 1 2 3 8 2 5 5 7 9 6 1 2 2 4 6 3 0 2 8 0 9 5.3- Biểu diễn cõy nhị phõn 5.3.1- Biểu diễn cõy nhị phõn bằng danh sỏch tuyến tớnh Trong trường hợp cõy nhị phõn đầy đủ, ta cú thể dễ dàng biểu diễn cõy nhị phõn bằng một mảng lưu trữ kế tiếp. Trong đú node gốc là phần tử đầu tiờn của mảng (phần 197
  6. tử thứ 1), node con thứ i>=1 của cõy nhị phõn là phần tử thứ 2i, 2i + 1 hay cha c ủa node thứ j là [j/2]. Với qui tắc đú, cõy nhị phõn cú thể biểu diễn bằng một vector V sao cho nội dung của node thứ i được lưu trữ trong thành phần V[i] của vector V. Ngược lại, nếu biết địa chỉ của phần tử thứ i trong vector V chỳng ta cũng hoàn toàn xỏc định được ngược lại địa chỉ của node cha, địa chỉ node gốc trong cõy nhị phõn. Vớ dụ: cõy nhị phõn trong hỡnh 5.7 sẽ được lưu trữ kế tiếp như sau: V[0] V[1] V[2] V[3] V[4] V[5] V[6] 3 0 30 25 37 22 28 35 40 2 3 5 7 2 2 3 4 2 8 5 0 Hỡnh 5.7- Lưu trữ kế tiếp của cõy nhị phõn Đối với cõy nhị phõn khụng đầy đủ, việc lưu trữ bằng mảng tỏ ra khụng hiệu quả vỡ chỳng ta phải bỏ trống quỏ nhiều phần tử gõy lóng phớ bộ nhớ như trong vớ dụ sau: Hỡnh 5.8- Lưu trữ kế tiếp của cõy nhị phõn khụng đầy đủ V[0] V[1] V[2] V[3] V[4] V[5] V[6] 3 0 φ 30 25 37 22 35 φ 2 3 5 7 2 3 2 5 5.3.2- Biểu diễn cõy nhị phõn bằng danh sỏch múc nối Trong cỏch lưu trữ cõy nhị phõn bằng danh sỏch múc nối, mỗi node được mụ tả bằng ba loại thụng tin chớnh : left là một con trỏ trỏ tới node bờn trỏi của cõy nhị phõn; infor : là thụng tin v ề node, infor cú thể là một biến đơn hoặc một cấu trỳc; right là một con trỏ trỏ tới node bờn phải của cõy nhị phõn. Trong trường hợp node là node lỏ thỡ con trỏ left và con tr ỏ right được trỏ tới con trỏ NULL. Đối với node lệch trỏi, con trỏ right sẽ trỏ tới con trỏ NULL, 198
  7. ngược lại đối với node lệch phải, con trỏ left cũng sẽ trỏ tới con trỏ NULL. Cấu trỳc của một node được mụ tả trong hỡnh 5.9. Hỡnh 5.9 mụ tả một node của cõy nhị phõn. Left Infor Right Vớ dụ: cõy nhị phõn trong hỡnh 5.10 sẽ được biểu diễn bằng danh sỏch liờn kết như sau: Hỡnh 5.10: biểu diễn cõy nhị phõn bằng danh sỏch múc nối . 3 Left 30 0 R 2 3 5 7 Left 25 Left 37 N N 2 3 2 5 NULL 22 NULL NULL 35 NULL 5.4- Cỏc thao tỏc trờn cõy nhị phõn 5.4.1- Định nghĩa cõy nhị phõn bằng danh sỏch tuyến tớnh Mỗi node trong cõy được khai bỏo như một cấu trỳc gồm 3 trường: infor, left, right. Toàn bộ cõy cú thể coi như một mảng mà mỗi phần tử của nú là một node. Trường infor tổng quỏt cú thể là một đối tượng dữ liệu kiểu cơ bản hoặc một cấu trỳc. Vớ d ụ: định nghĩa một cõy nhị phõn lưu trữ danh sỏch cỏc số nguyờn: #define MAX 100 #define TRUE 1 #define FALSE 0 struct node { int infor; int left; int right; }; typedef struct node node[MAX]; 199
  8. 5.4.2- Định nghĩa cõy nhị phõn theo danh sỏch liờn kết: struct node { int infor; struct node *left; struct node *right; } typedef struct node *NODEPTR 5.4.3- Cỏc thao tỏc trờn cõy nhị phõn Cấp phỏt bộ nhớ cho một node mới của cõy nhị phõn: NODEPTR Getnode(void) { NODEPTR p; p= (NODEPTR) malloc(sizeof(struct node)); return(p); } Giải phúng node đó được cấp phỏt void Freenode( NODEPTR p){ free(p); } Khởi động cõy nhị phõn void Initialize(NODEPTR *ptree){ *ptree=NULL; } Kiểm tra tớnh rỗng của cõy nhị phõn: int Empty(NODEPTR *ptree){ if (*ptree==NULL) 200
  9. return(TRUE); return(FALSE); } Tạo một node lỏ cho cõy nhị phõn: • Cấp phỏt bộ nhớ cho node; • Gỏn giỏ trị thụng tin thớch hợp cho node; • Tạo liờn kết cho node lỏ; NODEPTR Makenode(int x){ NODEPTR p; p= Getnode();// cấp phỏt bộ nhớ cho node p ->infor = x; // gỏn giỏ trị thụng tin thớch hợp = NULL; // tạo liờn kết trỏi của node lỏ p ->left = NULL;// tạo liờn kết phải của node lỏ p ->right return(p); } Tạo node con bờn trỏi của cõy nhị phõn: Để tạo được node con bờn trỏi là node lỏ của node p, chỳng ta thực hiện như sau: • Nếu node p khụng cú thực (p==NULL), ta khụng thể tạo được node con bờn trỏi của node p; • Nếu node p đó cú node con bờn trỏi (p->left!=NULL), thỡ chỳng ta cũng khụng thể tạo được node con bờn trỏi node p; • Nếu node p chưa cú node con bờn trỏi, thỡ việc tạo node con bờn trỏi chớnh là thao tỏc make node đó được xõy dựng như trờn; Hỡnh 5.11 sẽ minh họa cho thao tỏc tạo node con X phớa bờn trỏi của node D. void Setleft(NODEPTR p, int x ){ if (p==NULL){ // nếu node p khụng cú thực thỡ khụng thể thực hiện được printf(“\n Node p khụng cú thực”); 201
  10. delay(2000); return; } // nếu node p cú thực và tồn tại lỏ con bờn trỏi thỡ cũng khụng thực hiện được else if ( p ->left !=NULL){ printf(“\n Node p đó cú node con bờn trỏi”); delay(2000); return; } // nếu node cú thực và chưa cú node trỏi else p ->left = Makenode(x); } A A B C B C D E F D E F G H I X G H I Hỡnh 5.11 mụ tả thao tỏc thờm node con bờn trỏi cõy nhị phõn Tạo node con bờn phải của cõy nhị phõn: Để tạo được node con bờn phải là node lỏ của node p, chỳng ta làm như sau: • Nếu node p khụng cú thực (p==NULL), thỡ ta khụng thể thực hiện được thao tỏc thờm node lỏ vào node phải node p; • Nếu node p cú thực (p!=NULL) và đó cú node con bờn phải thỡ thao tỏc cũng khụng thể thực hiện được; • Nếu node p cú thực và chưa cú node con bờn phải thỡ việc tạo node con bờn phải node p được thực hiện thụng qua thao tỏc Makenode(); 202
  11. Hỡnh 5.12 sẽ minh họa cho thao tỏc tạo node con X phớa bờn phải của node E. void Setright(NODEPTR p, int x ){ if (p==NULL){ // Nếu node p khụng cú thực printf(“\n Node p khụng cú thực”); delay(2000); return; } // Nếu node p cú thực & đó cú node con bờn phải else if ( p ->right !=NULL){ printf(“\n Node p đó cú node con bờn phải”); delay(2000); return; } // Nếu node p cú thực & chưa cú node con bờn phải else p ->right = Makenode(x); } A A B C B C D E F D E F G X I G I Hỡnh 5.12 mụ tả thao tỏc thờm node con bờn phải cõy nhị phõn Thao tỏc xoỏ node con bờn trỏi cõy nhị phõn Thao tỏc loại bỏ node con bờn trỏi node p được thực hiện như sau: • Nếu node p khụng cú thực thỡ thao tỏc khụng thể thực hiện; 203
  12. • Nếu node p cú thực (p==NULL) thỡ kiểm tra xem p cú node lỏ bờn trỏi hay khụng; + Nếu node p cú thực và p khụng cú node lỏ bờn trỏi thỡ thao tỏc cũng kh ụng thể thực hiện được; + Nếu node p cú thực (p!=NULL) và cú node con bờn trỏi là q thỡ: - Nếu node q khụng phải là node lỏ thỡ thao tỏc cũng khụng thể thực hiện được (q->left!=NULL || q->right!=NULL); - Nếu node q là node lỏ (q->left==NULL && q->right==NULL) thỡ: • Giải phúng node q; • Thiết lập liờn kết mới cho node p; Thuật toỏn được thể hiện bằng thao tỏc Delleft() như dưới đõy: int Delleft(NODEPTR p) { NODEPTR q; int x; if ( p==NULL) printf(“\n Node p khụng cú thực”);delay(2000); exit(0); } q = p ->left; // q là node cần xoỏ; x = q->infor; //x là nội dung cần xoỏ if (q ==NULL){ // kiểm tra p cú lỏ bờn trỏi hay khụng printf(“\n Node p khụng cú lỏ bờn trỏi”); delay(2000); exit(0); } if (q->left!=NULL || q->right!=NULL) { // kiểm tra q cú phải là node lỏ hay khụng printf(“\n q khụng là node lỏ”); 204
  13. delay(2000); exit(0); } p ->left =NULL; // tạo liờn kết mới cho p Freenode(q); // giải phúng q return(x); } Thao tỏc xoỏ node con bờn phải cõy nhị phõn Thao tỏc loại bỏ node con bờn phải node p được thực hiện như sau: • Nếu node p khụng cú thực thỡ thao tỏc khụng thể thực hiện; • Nếu node p cú thực (p==NULL) thỡ kiểm tra xem p cú node lỏ bờn phải hay khụng; + Nếu node p cú thực và p khụng cú node lỏ bờn phải thỡ thao tỏc cũng khụng thể thực hiện được; + Nếu node p cú thực (p!=NULL) và cú node con bờn phải là q thỡ: - Nếu node q khụng phải là node lỏ thỡ thao tỏc cũng khụng thể thực hiện được (q->left!=NULL || q->right!=NULL); - Nếu node q là node lỏ (q->left==NULL && q->right==NULL) thỡ: • Giải phúng node q; • Thiết lập liờn kết mới cho node p; Thuật toỏn được thể hiện bằng thao tỏc Delright() như dưới đõy: int Delright(NODEPTR p) { NODEPTR q; int x; if ( p==NULL) printf(“\n Node p khụng cú thực”);delay(2000); exit(0); } 205
  14. q = p ->right; // q là node cần xoỏ; x = q->infor; //x là nội dung cần xoỏ if (q ==NULL){ // kiểm tra p cú lỏ bờn phải hay khụng printf(“\n Node p khụng cú lỏ bờn phải”); delay(2000); exit(0); } if (q->left!=NULL || q->right!=NULL) { // kiểm tra q cú phải là node lỏ hay khụng printf(“\n q khụng là node lỏ”); delay(2000); exit(0); } p ->right =NULL; // tạo liờn kết cho p Freenode(q); // giải phúng q return(x); } Thao tỏc tỡm node cú nội dung là x trờn cõy nhị phõn: Để tỡm node cú nội dung là x trờn cõy nhị phõn, chỳng ta cú thể xõy dựng bằng thủ tục đệ qui như sau: • Nếu node gốc (proot) cú nội dung là x thỡ proot chớnh là node cần tỡm; • Nếu proot =NULL thỡ khụng cú node nào trong cõy cú nội dung là x; • Nếu nội dung node gốc khỏc x (proot->infor!=x) và proot!=NULL thỡ: • Tỡm node theo nhỏnh cõy con bờn trỏi (proot = proot->left); • Tỡm theo nhỏnh cõy con bờn phải; Thuật toỏn tỡm một node cú nội dung là x trong cõy nhị phõn được thể hiện như sau: NODEPTR Search( NODEPTR proot, int x) { 206
  15. NODEPTR p; if ( proot ->infor ==x) // điều kiện dừng return(proot); if (proot ==NULL) return(NULL); p = Search(proot->left, x); // tỡm trong nhỏnh con bờn trỏi if (p ==NULL) // Tỡm trong nhỏnh con bờn phải Search(proot->right, x); return(p); } 5.5- Ba phộp duyệt cõy nhị phõn (Traversing Binary Tree) Phộp duyệt cõy là phương phỏp thăm (visit) cỏc node một cỏch cú hệ thống sao cho mỗi node chỉ được thăm một lần. Cú ba phương phỏp để duyệt cõy nhị phõn đú là : • Duyệt theo thứ tự trước (Preorder Travesal); • Duyệt theo thứ tự giữa (Inorder Travesal); • Duyệt theo thứ tự sau (Postorder Travesal). Hỡnh 5.13 mụ tả phương phỏp duyệt cõy nhị phõn A B C D E F G 5.5.1- Duyệt theo thứ tự trước (Preorder Travesal) • Nếu cõy rỗng thỡ khụng làm gỡ; • Nếu cõy khụng rỗng thỡ : 207
  16. + Thăm node gốc của cõy; + Duyệt cõy con bờn trỏi theo thứ tự trước; + Duyệt cõy con bờn phải theo thứ tự trước; Vớ dụ : với cõy trong hỡnh 5.13 thỡ phộp duyệt Preorder cho ta kết quả duyệt theo thứ tự cỏc node là :A -> B -> D -> E -> C -> F -> G. Với cỏch duyệt theo thứ tự trước, chỳng ta cú thể cài đặt cho cõy được định nghĩa trong mục 5.4 bằng một thủ tục đệ qui như sau: void Pretravese ( NODEPTR proot ) { if ( proot !=NULL) { // nếu cõy khụng rỗng printf(“%d”, proot->infor); // duyệt node gốc Pretravese(proot ->left); // duyệt nhỏnh cõy con bờn trỏi Pretravese(proot ->right); // Duyệt nhỏnh con bờn phải } } 5.5.2- Duyệt theo thứ tự giữa (Inorder Travesal) • Nếu cõy rỗng thỡ khụng làm gỡ; • Nếu cõy khụng rỗng thỡ : + Duyệt cõy con bờn trỏi theo thứ tự giữa; + Thăm node gốc của cõy; + Duyệt cõy con bờn phải theo thứ tự giữa; Vớ dụ : cõy trong hỡnh 5.13 thỡ phộp duyệt Inorder cho ta kết quả duyệt theo thứ tự cỏc node là :D -> B -> E -> A -> F -> C -> G. Với cỏch duyệt theo thứ tự giữa, chỳng ta cú thể cài đặt cho cõy được đ ịnh nghĩa trong mục 5.4 bằng một thủ tục đệ qui như sau: void Intravese ( NODEPTR proot ) { if ( proot !=NULL) { // nếu cõy khụng rỗng 208
  17. Intravese(proot ->left); // duyệt nhỏnh cõy con bờn trỏi printf(“%d”, proot->infor); // duyệt node gốc Intravese(proot ->right); // Duyệt nhỏnh con bờn phải } } 5.5.3- Duyệt theo thứ tự sau (Postorder Travesal) • Nếu cõy rỗng thỡ khụng làm gỡ; • Nếu cõy khụng rỗng thỡ : + Duyệt cõy con bờn trỏi theo thứ tự sau; + Duyệt cõy con bờn phải theo thứ tự sau; + Thăm node gốc của cõy; Vớ dụ: cõy trong hỡnh 5.13 thỡ phộp duyệt Postorder cho ta kết quả duy ệt theo thứ tự cỏc node là :D -> E -> B -> F -> G-> C -> A . Với cỏch duyệt theo thứ tự giữa, chỳng ta cú thể cài đặt cho cõy được đ ịnh nghĩa trong mục 5.4 bằng một thủ tục đệ qui như sau: void Posttravese ( NODEPTR proot ) { if ( proot !=NULL) { // nếu cõy khụng rỗng Posttravese(proot ->left); // duyệt nhỏnh cõy con bờn trỏi Posttravese(proot ->right); // duyệt nhỏnh con bờn phải printf(“%d”, proot->infor); // duyệt node gốc } } 5.6- Cài đặt cõy nhị phõn bằng danh sỏch tuyến tớnh #include #include #include 209
  18. #include #include #include #define TRUE 1 #define FALSE 0 #define MAX 100 typedef struct { int infor; int left; int right; } nodetype; nodetype node[MAX]; int avail; int Getnode(void) { int p; if (avail==-1){ printf("\n Het node danh san"); return(avail); } p=avail; avail=node[avail].left;// Gan gia tri NULL cho node la be trai. Vi chung ta dang duyet cay theo Phuong phap tuyen tinh nen se la cay nhi phan day du va duyet ben trai truoc ; return(p); } void Freenode (int p){ node[p].left=avail; avail=p; } void Initialize(int *ptree){ *ptree=-1; } int Empty(int *ptree){ 210
  19. if(*ptree==-1) return(TRUE); return(FALSE); } int Makenode(int x){ int p; p=Getnode(); // ket qua cua cau lenh nay la no se tra lai cho p gia tri cua avail Gia tri cua p trong bai la gia tri 0 vi ta co tai ham main avail = 0; /*int Getnode(void) { int p; if (avail= =-1){ printf("\n Het node danh san"); return(avail); } p=avail; avail=node[avail].left;// Gan gia tri NULL cho node la be trai. Vi chung ta dang duyet cay theo Phuong phap tuyen tinh nen se la cay nhi phan day du va duyet ben trai truoc ; return(p); } */ node[p].infor = x;// gan gia tri x la noi dung cho node dau tien hay chinh la node goc node[p].left=-1; node[p].right=-1; return(p);// p o day la thu tu ma node cua node goc luc nay noi dung cua node goc co gia tri la x. } void Setleft(int p, int x){ if (p==-1) printf("\n Node p Khong co thuc"); else { if (node[p].left!=-1) 211
  20. printf("\n Nut p da co ben trai"); else node[p].left=Makenode(x); } delay(2000); } void Setright(int p, int x){ if (p==-1) printf("\n Node p Khong co thuc"); else { if (node[p].right!=-1) printf("\n Nut p da co ben phai"); else node[p].right=Makenode(x); } delay(2000); } int Delleft(int p){ int q, x; if (p ==-1){ printf("\n Node p khong co thuc"); delay(2000);return(-1); } else { q=node[p].left; x=node[q].infor; if (q==-1){ printf("\n Node p khong co nut trai"); delay(2000);return(q); } else if (node[q].left!=-1 || node[q].right!=-1){ 212
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2