Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 52 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
52
Dung lượng
456,73 KB
Nội dung
Ch ng 3: C u trúc Trees TS Tr n Cao N m 2010 Thu t ng c b n ̈ Cây: m t t p h p ph n t g i nút (nodes): ̈ ̈ ̈ ̈ ̈ ̈ ̈ Có m t nút đ c phân bi t g i nút g c (root) Quan h cha - (parenthood): xác đ nh h th ng c u trúc phân c p nút M i nút, tr nút g c, có nh t m t nút cha M t nút có th có nhi u nút ho c nút M i nút bi u di n m t ph n t t p h p xét có th có m t ki u b t k Bi u di n nút b ng m t kí t , m t chu i ho c m t s ghi vòng tròn M i quan h cha đ c bi u di n theo qui c nút cha dòng nút dòng d i đ c n i b i m t đo n th ng Ví d m t 10 nh ngh a ̈ ̈ ̈ M t nút đ n đ c m t Nút c ng nút g c c a Gi s ta có n m t nút đ n đ c k T1, , Tk v i nút g c t ng ng n1, , nk có th xây d ng m t m i b ng cách cho nút n cha c a nút n1, , nk Cây m i có nút g c nút n T1, , Tk đ c g i T p r ng c ng đ c coi m t g i r ng kí hi u ∅ n n1 n2 nk T1 T2 Tk Thu t ng ̈ ̈ ̈ ̈ ̈ ̈ ̈ ng đi: chu i nút n1, , nk, ni nút cha c a nút ni+1, v i i=1 k-1 dài đ ng = s nút – ng t m t nút đ n có đ dài b ng không N u có đ ng t nút a đ n nút b ta nói a ti n b i (ancestor) c a b, b g i h u du (descendant) c a nút a m t nút v a ti n b i v a h u du c a Ti n b i ho c h u du c a m t nút khác v i g i ti n b i ho c h u du th c s Nút g c ti n b i th c s 10 ̈ ̈ ̈ ̈ ̈ ̈ ̈ Nút h u du th c s g i nút (leaf) Nút không ph i ta g i nút trung gian (interior) Cây c a m t m t nút v i t t c h u du c a Chi u cao c a m t nút đ dài đ ng l n nh t t nút t i Chi u cao c a chi u cao c a nút g c sâu c a m t nút đ dài đ ng t nút g c đ n nút Các nút có m t đ sâu i ta g i nút có m t m c i 10 Th t nút ̈ ̈ ̈ ̈ ̈ N u ta phân bi t th t nút c a m t nút g i có th t Th t qui c t trái sang ph i N u không phân bi t rõ ràng th t nút ta g i th t Các nút m t nút cha g i nút anh em ru t (siblings) Quan h "trái sang ph i" c a anh em ru t có th m r ng cho hai nút b t k A B C A C B Duy t ̈ ̈ ̈ Duy t m t qui t c cho phép qua l n l t t t c nút c a m i nút m t l n Danh sách li t kê nút (tên nút/ giá tr ) theo th t qua g i danh sách t Ba cách t quan tr ng: ̈ ̈ ̈ t ti n t (preorder), t trung t (inorder), t h u t (posorder) ̈ ̈ ̈ Cây r ng: ̈ ti n t , trung t , h u t = R NG Cây ch có m t nút n: ̈ ti n t , trung t , h u t c a cây= n n T n1 n2 nk T1 T2 Tk T g c n, T1,…, Tk: ̈ Ti n t (T) = n, ti n t (T1), …, ti n t (Tk) ̈ Trung t (T) = Trung t (T1), n, trung t (T2), …, trung t (Tk) ̈ H u t (T) = h u t (T1), …, h u t (Tk), n Ví d t ̈ ̈ ̈ Ti n t 1, 2, 5, 6, 3, 7, 8, 9, 10, Trung t 5, 2, 6, 1, 8, 7, 3, 9, 10, H ut 5, 6, 2, 8, 7, 9, 10, 3, 4, 10 10 CÂY NH PHÂN (BINARY TREES) ̈ ̈ ̈ Cây nh phân r ng ho c mà m i nút có t i đa hai nút Các nút c a đ c phân bi t th t rõ ràng: ̈ Con trái ̈ Con ph i Ta qui c v nút trái bên trái nút cha nút ph i bên ph i nút cha, m i nút đ c n i v i nút cha c a b i m t đo n th ng 1 5 38 Duy t ̈ ̈ ̈ Duy t ti n t (Node-LeftRight): t nút g c, t ti n t trái r i t ti n t ph i Duy t trung t (Left-NodeRight): t trung t trái r i đ n nút g c sau t trung t ph i Duy t h u t (Left-RightNode): t h u t trái r i t h u t ph i sau nút g c nút left right 39 A B D H C F E I J K G L M Các danh sách t Các danh sách t nh phân t ng quát Ti n t : ABDHIEJCFKLGM ABDHIEJCFKLGM Trung t : HDIBJEAKFLCGM HDIBJEAKFLCMG H u t : HIDJEBKLFMGCA HIDJEBKLFMGCA 40 Cài đ t nh phân typedef int DataType; typedef struct Node{ DataType Data; Node* left; Node* right; }; typedef Node* Tree; T o r ng void MAKENULL-_TREE(Tree& T){ T=NULL; } Ki m tra r ng int EMPTY_TREE(Tree T){ return T==NULL; } 41 Xác đ nh trái c a m t nút Tree LEFTCHILD(Tree n){ //n co kieu Node*, tuc la Tree if (n!=NULL) return n->left; else return NULL; } Xác đ nh ph i c a m t nút Tree RIGHTCHILD(Tree n){ if (n!=NULL) return n->right; else return NULL; } Ki m tra nút int ISLEAF(Tree n){ if(n!=NULL) return(LEFTCHILD(n)== NULL) && (RIGHTCHILD(n)==NULL); else return 0; } Xác đ nh s nút c a int NB_NODES(Tree T){ if(EMPTY_TREE(T)) return 0; else return +NB_NODES(LEFTCHILD(T)) + NB_NODES(RIGHTCHILD(T)); } T o m i t hai có s n Tree Create2(DataType v,Tree l,Tree r){ Tree N; N=(Node*)malloc(sizeof(Node)); N->Data=v; N->left=l; N->right=r; return N; } 42 void PreOrder(Tree T){ If (T!=NULL){ printf("%c ",T->Data); PreOrder(LEFTCHILD(T)); PreOrder(RIGHTCHILD(T)); } } 43 Th t c t trung t void InOrder(Tree T){ if (T!=NULL) { InOrder(LEFTCHILD(T)); printf("%c ",T->Data); InOrder(RIGHTCHILD(T)); } } 44 Th t c t h u t void PosOrder(Tree T){ if (T!=NULL) { PosOrder(LEFTCHILD(T)); PosOrder(RIGHTCHILD(T)); printf("%c ",T->Data); } } 45 ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ SO nut cua cay: Duyet NLR ABDCEF Duyet LNR DBAECF Duyet LRN DBEFCA Press any key to continue void main(){ Tree T1 = Create2('D', NULL, NULL); Tree T2 = Create2('E', NULL, NULL); Tree T3 = Create2('F', NULL, NULL); Tree T4 = Create2('C', T2,T3); Tree T5 = Create2('B', T1, NULL); Tree T = Create2('A', T5, T4); printf(“So nut cua cay la %d “, NB_NODES(T)); printf("Duyet NLR \n"); PreOrder(T); printf("\n"); printf("Duyet LNR \n"); InOrder(T); printf("\n"); printf("Duyet LRN \n"); PosOrder(T); printf("\n"); } 46 Cây tìm ki m nh phân binary search tree 20 ̈ Cây tìm ki m nh phân (TKNP) nh phân mà khoá t i m i nút l n h n khoá c a t t c nút thu c bên trái nh h n khoá c a t t c nút thu c bên ph i typedef KeyType; typedef struct Node{ KeyType Key; Node* Left; Node* Right; }; typedef Node* Tree; 10 35 17 15 22 42 37 47 Tìm ki m nút có khóa x 20 10 17 15 Tree Search (KeyType x,Tree Root){ if (Root==NULL) return NULL; 35 else if(Root->Key==x) return Root; else if (Root->Keyright); else return Search(x,Root->left); 37 } Th i gian tìm ki m nút : O(h), h chi u cao 48 Thêm m t khoá vào TKNP 20 void InsertNode(KeyType x,Tree& Root ){ /* thêm nút m i ch a khoá x */ if (Root == NULL){ Root=(Node*)malloc(sizeof(Node)); Root->Key = x; Root->Left = NULL; Root->Right = NULL; 10 } else if (x < Root->Key) InsertNode(x,Root->Left); else if (x>Root->Key)InsertNode(x,Root->Right); 35 17 15 22 19 42 37 } 49 Xóa m t nút TKNP 20 10 10 NULL 35 Xóa nút 35 Xóa nút 20 Xóa nút 17 15 20 10 17 35 17 25 42 22 24 50 Xoá m t nút KeyType DeleteMin (Tree& Root ){ KeyType k; if (Root->Left == NULL){ k=Root->Key; Root = Root->Right; return k; } else return DeleteMin(Root->Left); } void DeleteNode(KeyType x,Tree& Root){ if (Root!=NULL) if (x < Root->Key) DeleteNode(x,Root->Left); else if (x > Root->Key) DeleteNode(x,Root->Right); else if ((Root->Left==NULL) && (Root->Right==NULL)) Root=NULL; else if (Root->Left == NULL) Root = Root->Right; else if (Root->Right==NULL) Root = Root->Left; else Root->Key = DeleteMin(Root->Right); } 51 T NG K T CH ̈ ̈ ̈ ̈ ̈ ̈ ̈ ̈ NG M t s khái ni m c b n v t ng quát, Cây nh phân, Cách bi u di n bi u th c toán h c, Các bi u th c t Cài đ t b ng m ng, tr , danh sách con, trái nh t, anh em ru t ph i Cây tìm ki m nh phân nh m t ng d ng nh phân t ch c d li u ph c v cho tìm ki m nhanh Bài t p ch ng Th c hành: bu i 52 [...]... nút c a t t c các cây 31 Các khai báo c n thi t là #define MaxLength … #define NULL -1 typedef … DataType; typedef struct { DataType Data; int LeftMost_Child; int Right_Sibling; } Node; Node CELLSPACE [MaxLength]; 32 A B C 0 D E 1 Available Root null D Null 2 4 3 8 3 B 1 7 5 4 E Null null 3 5 A 3 null Null 6 7 0 C Null 8 Ch s null 5 6 Data Leftmost_ Child Right_ Sibling Parent 33 Hàm CREATE2 t o cây... i nút g c Nút cha đ c đánh s tr c các nút con Các nút con cùng m t nút cha đ c đánh s l n l t t trái sang ph i 16 1 2 3 5 6 7 4 9 10 Maxlength 8 Ch s 1 2 3 4 5 6 7 8 9 10 Pare nt -1 1 1 1 2 2 3 7 3 3 data Maxnode 17 Ví d khác A 1 3 C B 4 D F 5 0 8 E G 6 I 2 J 9 H 7 18 Khai báo c u trúc d li u #define MAXLENGTH /* ch s t i đa c a m ng */ #define NULL -1 typedef DataType; typedef int Node; typedef... a cây m i return temp; } 34 A B D C F E 0 1 Available -A 3 2 Root 6 3 B 7 5 1 4 E 3 5 C 8 1 6 Ch s 0 7 D 4 3 8 F 1 Data Leftmost_Child Right_Sibli ng Parent 35 Cài đ t cây b ng con tr Các khai báo nh sau typedef int DataType; typedef struct Cell{ DataType Data; Cell* Leftmost_Child; Cell* Right_Sibling; Cell* Parent; }; typedef Cell* Node; typedef Node Tree; 36 ... cay vua nhap la\n"); PosOrder(ROOT(T),T); getch(); } 29 Bi u di n cây b ng danh sách các con 1 A 2 3 4 B 5 C 6 E 7 F 9 G 8 J D 10 H I 1 A 2 3 2 B 5 6 3 C 7 9 4 D 5 E 6 F 7 G 8 J 9 H 10 I 4 10 8 11 12 30 Bi u di n theo con trái nh t và anh em ru t ph i ̈ Các c u trúc đã dùng đ mô t cây trên có m t s nh c đi m: không tr giúp phép t o m t cây l n t các cây nh h n, ngh a là ta khó có th cài đ t phép toán... n yêu c u đ bài nh sau: void main(){ printf("Nhap du lieu cho cay tong quat\n"); READTREE(T); printf("Danh sach duyet tien tu cua cay vua nhap la\n"); PreOrder(ROOT(T),T); printf("\nDanh sach duyet trung tu cua cay vua nhap la\n"); InOrder(ROOT(T),T); printf("\nDanh sach duyet hau tu cua cay vua nhap la\n"); PosOrder(ROOT(T),T); getch(); } 29 Bi u di n cây b ng danh sách các con 1 A 2 3 4 B 5 C 6 E.. .Bài t p A B H C D E K F L Duy t Ti n t , trung t , h u t cây ̈ ti n t : A B C D E F H K L ̈ trung t : C B E D F A K H L ̈ h ut :CEFDBKLHA 11 Cây có nhãn và cây bi u th c ̈ Ta th ng l u tr k t h p m t nhãn (label) ho c còn g i là m t giá tr (value) v i m t nút c a cây Nh v y nhãn c a m t nút không ph i là tên nút mà là giá tr đ c l u gi t i nút đó n1 + * _ n2 n3 n4 n5 n6 n7 a b a... mà là giá tr đ c l u gi t i nút đó n1 + * _ n2 n3 n4 n5 n6 n7 a b a c Bi u th c: (a+b)*(a-c) ̈ Qui t c bi u di n bi u th c toán h c E1 E2 E1 E2 12 + + a+b a b b a - a-b a b - a*c - b * a * b c a - c b 13 cây bi u th c ̈ - Khi duy t m t cây bi u di n m t bi u th c toán h c và li t kê nhãn c a các nút theo th t duy t thì ta có: ̈ ̈ ̈ Bi u th c d ng ti n t hay bi u th c ti n t (prefix) t ng ng v i phép... ph i c a m t nút Node RIGHT_SIBLING(Node n,Tree T){ Node i,parent; if (n ... if (x>Root->Key)InsertNode(x,Root->Right); 35 17 15 22 19 42 37 } 49 Xóa m t nút TKNP 20 10 10 NULL 35 Xóa nút 35 Xóa nút 20 Xóa nút 17 15 20 10 17 35 17 25 42 22 24 50 Xoá m t nút KeyType DeleteMin... (T1), …, h u t (Tk), n Ví d t ̈ ̈ ̈ Ti n t 1, 2, 5, 6, 3, 7, 8, 9, 10, Trung t 5, 2, 6, 1, 8, 7, 3, 9, 10, H ut 5, 6, 2, 8, 7, 9, 10, 3, 4, 10 10 Bài t p A B H C D E K F L Duy t Ti n t , trung t ,... Node* Right; }; typedef Node* Tree; 10 35 17 15 22 42 37 47 Tìm ki m nút có khóa x 20 10 17 15 Tree Search (KeyType x,Tree Root){ if (Root==NULL) return NULL; 35 else if(Root->Key==x) return Root;