1. Trang chủ
  2. » Cao đẳng - Đại học

Chương 2 cây nhị phân và tìm kiếm nhị phân

10 3K 0

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

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 470,35 KB

Nội dung

NỘI DUNG • • • • • CẤU TRÚC CÂY CÁC THUẬT NGỮ CƠ BẢN CÁC PHÉP TOÁN CHÍNH CÁC PHƯƠNG PHÁP CÀI ĐẶT CÂY CÂY NHỊ PHÂN CÂY TÌM KIẾM NHỊ PHÂN Bộ môn Công nghệ phần mềm, Khoa CNTT&TT, Đại học Cần Thơ CÂY NHỊ PHÂN CÂY NHỊ PHÂN • Định nghĩa • Ví dụ – Là rỗng có tối đa hai nút – Hai nút có thứ tự phân biệt rõ ràng • Con trái (left child): nằm bên trái nút cha • Con phải (right child): nằm bên phải nút cha • Ví dụ Abner Abner Abigail Abigail 3 4 Angela Angela Adela Adela Adam Adam Alex Alex Alice Alice Agnes Agnes Allen Allen Audrey Audrey => nhị phân khác Arthur Arthur DUYỆT CÂY NHỊ PHÂN CÀI ĐẶT CÂY NHỊ PHÂN • Các biểu thức duyệt: (N:Node, R:Right, L:Left) – Tiền tự (NLR): duyệt nút gốc, duyệt tiền tự trái, duyệt tiền tự phải – Trung tự (LNR): duyệt trung tự trái, duyệt nút gốc, duyệt trung tự phải – Hậu tự (LRN): duyệt hậu tự trái, duyệt hậu tự phải, duyệt nút gốc • Khai báo typedef … TData; typedef struct Tnode { TData Data; TNode* left,right; }; typedef TNode* TTree; Data left right • Tạo rỗng void MakeNullTree(TTree *T){ (*T)=NULL; } • Kiểm tra rỗng int EmptyTree(TTree T){ return T==NULL; } CÀI ĐẶT CÂY NHỊ PHÂN CÀI ĐẶT CÂY NHỊ PHÂN • Xác định trái TTree LeftChild(TTree n){ if (n!=NULL) return n->left; else return NULL; } • Xác định phải Data left right TTree RightChild(TTree n){ if (n!=NULL) return n->right; else return NULL; } • Kiểm tra xem nút có phải không? int IsLeaf(TTree n){ if(n!=NULL) return(LeftChild(n)==NULL)&&(RightChild(n)==NULL); else return 0; } • Duyệt tiền tự void PreOrder(TTree T) { printf("%c ",T->Data); if (LeftChild(T)!=NULL) PreOrder(LeftChild(T)); if(RightChild(T)!=NULL) PreOrder(RightChild(T)); } • Duyệt trung tự void InOrder(TTree T){ if (LeftChild(T)!=NULL)InOrder(LeftChild(T)); printf("%c ",T->data); if(RightChild(T)!=NULL) InOrder(RightChild(T)); } CÀI ĐẶT CÂY NHỊ PHÂN CÀI ĐẶT CÂY NHỊ PHÂN • Tạo từ hai có sẵn • Duyệt hậu tự void PosOrder(TTree T){ if(LeftChild(T)!=NULL) PosOrder(LeftChild(T)); if(RightChild(T)!=NULL)PosOrder(RightChild(T)); printf("%c ",T->data); } • Xác định số nút int nb_nodes(TTree T){ if(EmptyTree(T)) return 0; else return + nb_nodes(LeftChild(T))+ nb_nodes(RightChild(T)); } CÂY TÌM KIẾM NHỊ PHÂN (Binary search tree-BST) TTree Create2(Tdata v,TTree l,TTree r){ TTree N; N=(TNode*)malloc(sizeof(TNode)); N->Data=v; N->left=l; N->right=r; return N; } CÂY TÌM KIẾM NHỊ PHÂN • Ví dụ • Định nghĩa Cây BST nhị phân mà nhãn nút lớn nhãn tất nút thuộc bên trái nhỏ nhãn tất nút thuộc bên phải 27 12 • Mô hình 40 34 20 50 30 a • Nhận xét Các phần tử < a Các phần tử > a – Trên BST nút trùng khóa – Cây BST tìm kiếm nhị phân – Duyệt trung tự tạo thành dãy nhãn có giá trị tăng: 4, 12, 20, 27, 30, 34, 40, 50 CÀI ĐẶT CÂY BST • Khai báo typedef KeyType; typedef struct Node* NodeType; struct Node { KeyType Key; NodeType Left,Right; } typedef NodeType Tree; CÀI ĐẶT CÂY BST Tree Search(KeyType X,Tree Root){ if (Root == NULL) return NULL;//không tìm thấy X else if (Root->Key == X) // tìm thấy khoá X return Root; else if (Root->KeyRight); else //tìm tiếp bên trái return Search(X,Root->Left); } CÀI ĐẶT CÂY BST • Tìm kiếm nút có khoá X – Bắt đầu từ nút gốc ta tiến hành bước sau: • Nếu nút gốc NULL khóa X • Nếu X khóa nút gốc giải thuật dừng tìm gặp X • Nếu X nhỏ nhãn nút hành: tìm X bên trái • Nếu X lớn nhãn nút hành: tìm X bên phải CÀI ĐẶT CÂY BST • Thêm nút có khoá X vào Muốn thêm nút có khóa X vào BST, trước tiên ta phải tìm kiếm xem có X chưa Nếu có giải thuật kết thúc, chưa ta thêm vào Việc thêm vào không làm phá vỡ tính chất BST – Giải thuật thêm vào sau: nút gốc ta tiến hành bước sau: – Nếu nút gốc NULL khóa X chưa có cây, ta thêm nút – Nếu X khóa nút gốc giải thuật dừng X có – Nếu X nhỏ nhãn nút hành: xen X vào bên trái – Nếu X lớn nhãn nút hành: xen X vào bên phải CÀI ĐẶT CÂY BST CÀI ĐẶT CÂY BST • Ví dụ: Xen nút có khóa 32 27 12 40 34 20 50 27 30 12 40 34 20 30 Các thao tác xen 50 void InsertNode(KeyType X, TTree *T){ if((*T) == NULL){ (*T)= (NodeType)malloc(sizeof(Node)); (*T)->Key = X; (*T)->Left = NULL; (*T)->Right = NULL; } else if((*T)->Key == X) printf("Da ton tai khoa X"); else if((*T)->Key > X) InsertNode(X,&(*T)->left); else InsertNode(X,&(*T)->right); } 32 CÀI ĐẶT CÂY BST CÀI ĐẶT CÂY BST • Xóa nút khóa X khỏi – Muốn xóa nút có khóa X BST Trước tiên ta phải tìm xem có X không – Nếu không giải thuật kết thúc – Nếu gặp nút N chứa khóa X, có trường hợp xảy • Trường hợp 1: – N nút lá: thay nút NULL – Ví dụ: Xóa nút nhãn 20 27 12 12 40 34 20 Nút cần xóa 27 30 50 40 34 50 30 CÀI ĐẶT CÂY BST CÀI ĐẶT CÂY BST • Trường hợp – N có con: thay nút – Ví dụ: xóa nút có nhãn 34 • Trường hợp – N có hai con: thay nút • Nút có nhãn lớn bên trái, • Nút có nhãn nhỏ bên phải 27 12 40 27 50 34 30 12 nút cần xóa 40 50 30 CÀI ĐẶT CÂY BST CÀI ĐẶT CÂY BST • Ví dụ: Xoá nút có nhãn 27 nhãn lớn bên trái 12 40 30 12 50 30 12 nút cần xóa 27 40 30 50 40 50 KeyType DeleteMin(TTree *T) { KeyType k; if((*T)->Left == NULL){ k = (*T)->Key; (*T) = (*T)->Right; return k; } else return DeleteMin(&(*T)->Left); } nhãn nhỏ bên phải KIẾN THỨC BỔ SUNG void DeleteNode(KeyType X, TTree *T){ if((*T)!=NULL) //Kiem tra cay khac rong if(X < (*T)->Key) //Hy vong X nam ben trai cua nut DeleteNode(X,&(*T)->Left); else if(X > (*T)->Key) //Hy vong X nam ben phai cua nut DeleteNode(X,&(*T)->right); else if(((*T)->left==NULL)&&((*T)->right==NULL))//X la nut la (*T)=NULL; // Xoa nut X else if((*T)->left==NULL) //Chac chan co phai (*T) = (*T)->right; else if((*T)->right==NULL) //Chac chan co trai (*T) = (*T)->left; else // X co hai (*T)->Key = DeleteMin(&(*T)->right); } KIẾN THỨC BỔ SUNG • Bên TKNP phân “không cân bằng” • Thời gian tìm kiếm giá trị TKNP có N nút là: – O(log N) “cân bằng” (balanced) – O(N) “không cân bằng” (unbalanced) CÂY NHỊ PHÂN ĐẦY ĐỦ (full binary tree) • Một nhị phân “cây nhị phân đầy đủ” nếu: – Mỗi nút có xác nút – Tất nút có chiều cao CÂY NHỊ PHÂN ĐẦY ĐỦ • Ví dụ -Một nhị phân đầy đủ CÂY NHỊ PHÂN ĐẦY ĐỦ • Bài tập – Một nhị phân đầy đủ chiều cao h có nút lá? – Một nhị phân đầy đủ chiều cao h có tất nút? CÂY NHỊ PHÂN HOÀN CHỈNH (complete binary tree) • Một nhị phân hoàn chỉnh (về chiều cao) thỏa mãn điều kiện sau: – Mức đến h-1 trình bày nhị phân đầy đủ chiều cao h-1 – Một nhiều nút mức h-1 có 0, nút – Nếu j, k nút mức h-1, j có nhiều nút k j bên trái k CÂY NHỊ PHÂN HOÀN CHỈNH • Ví dụ AA BB CC DD HH EE II JJ FF GG KK F ig u re A c o m p le te b in a ry tre e CÂY NHỊ PHÂN HOÀN CHỈNH • Được cho tập hợp N nút, nhị phân hoàn chỉnh nút cung cấp số nút nhiều - với chiều cao trung bình nút nhỏ • Cây hoàn chỉnh n nút phải chứa nút có chiều cao log n CÂY CÂN BẰNG VỀ CHIỀU CAO – VÍ DỤ N M N-M ... • Một nhị phân cây nhị phân đầy đủ” nếu: – Mỗi nút có xác nút – Tất nút có chiều cao CÂY NHỊ PHÂN ĐẦY ĐỦ • Ví dụ -Một nhị phân đầy đủ CÂY NHỊ PHÂN ĐẦY ĐỦ • Bài tập – Một nhị phân đầy đủ chiều... nhãn nhỏ bên phải 27 12 40 27 50 34 30 12 nút cần xóa 40 50 30 CÀI ĐẶT CÂY BST CÀI ĐẶT CÂY BST • Ví dụ: Xoá nút có nhãn 27 nhãn lớn bên trái 12 40 30 12 50 30 12 nút cần xóa 27 40 30 50 40 50... } CÂY TÌM KIẾM NHỊ PHÂN (Binary search tree-BST) TTree Create2(Tdata v,TTree l,TTree r){ TTree N; N=(TNode*)malloc(sizeof(TNode)); N->Data=v; N->left=l; N->right=r; return N; } CÂY TÌM KIẾM NHỊ

Ngày đăng: 06/12/2015, 18:59

TỪ KHÓA LIÊN QUAN

w