1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng cấu trúc dữ liệu chương 3 TS trần cao đệ

52 278 0

Đ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

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;

Ngày đăng: 03/12/2015, 06:46

TỪ KHÓA LIÊN QUAN