Cấu Trúc Dữ Liệu Và Giải Thuật Chapter 5 Binarytree Tài Liệu Bao Gồm 6 Chapter Mong các bạn theo dõi đầy đủ để đạt kết quả cao . Để Cập Nhật Thêm Tìm Hiểu Hơn Nữa Về Tài Liệu IT Thì Các Bạn Có Thể Truy Cập : https:123doc.orgtrangcanhan4336953tailieuit.htm CẢM ƠN CÁC BẠN ĐÃ THEO DÕI
Trang 1Chương 5
Trang 2Mục tiêu
Giới thiệu khái niệm cấu trúc cây
Cấu trúc dữ liệu cây nhị phân tìm kiếm: tổ chức, các thuật toán, ứng dụng
Giới thiệu cấu trúc dữ liệu cây nhị phân tìm kiếm
Trang 3Cấu trúc cây
Trang 4Cấu trúc cây
Định nghĩa : cây là một tập hợp T các phần tử (gọi là
nút của cây), trong đó:
Một nút đặc biệt được gọi là gốc,
Các nút còn lại được chia thành những tập rời nhau T1,
T2 , , Tn theo quan hệ phân cấp trong đó Ti cũng là một cây
Mỗi nút ở cấp i sẽ quản lý một số nút ở cấp i+1 Quan
hệ này người ta còn gọi là quan hệ cha-con
Trang 55
Cấu trúc cây
Trang 6Cấu trúc cây
Trang 77
Khái niệm cơ bản
Bậc của một nút : là số cây con của nút đó
Bậc của một cây : là bậc lớn nhất của các nút trong cây (số cây con tối đa của một nút thuộc cây ) Cây có bậc n thì gọi
Trang 8Khái niệm cơ bản
Độ dài đường đi từ gốc đến nút x : là số nhánh cần đi qua kể từ gốc đến x
Độ dài đường đi tổng của cây :
trong đó Px là độ dài đường đi từ gốc đến X
Độ dài đường đi trung bình : PI = PT/n (n là số nút trên cây T)
Rừng cây: là tập hợp nhiều cây trong đó thứ tự các cây
Trang 9Khái niệm cơ bản
Trang 10Châu âu Mỹ Các nước khác
Trang 1111
Cấu trúc cây
Nhận xét:
Trong cấu trúc cây không tồn tại chu trình
Tổ chức 1 cấu trúc cây cho phép truy cập nhanh đến các phần tử của nó
Trang 12Cây nhị phân
Trang 1313
Cây nhị phân
Định nghĩa: Cây nhị phân là cây mà mỗi nút có tối
đa 2 cây con
Trong thực tế thường gặp các cấu trúc có dạng cây nhị phân Một cây tổng quát có thể biểu diễn thông qua cây nhị phân
Trang 14Cây nhị phân
Cây con
trái
Cây con phải
Hình ảnh một cây nhị phân
Trang 1515
Cây nhị phân
Figure 7.3: Binary tree structure
Trang 16Cây nhị phân
Figure 7.4: Skewed trees
Trang 1717
Cây nhị phân
Cây nhị phân dùng để biểu diễn một biểu thức toán học:
Trang 18 Đường đi (path): Tên các nút
của quá trình đi từ nút gốc theo
các cây con đến một nút nào đó
Mức
Trang 1919
Biểu diễn cây nhị phân
Biểu diễn cây nhị phân:
Thông tin lưu trữ tại nút
Địa chỉ nút gốc của cây con trái trong bộ nhớ
Địa chỉ nút gốc của cây con phải trong bộ nhớ
Trang 2121
Duyệt cây nhị phân
Có 3 kiểu duyệt chính:
Duyệt theo thứ tự trước (NLR)- Preorder
Duyệt theo thứ tự giữa (LNR)- Inorder
Duyệt theo thứ tựï sau (LRN)- Postorder
Tên của 3 kiểu duyệt này được đặt dựa trên trình tự của việc thăm nút gốc so với việc thăm 2 cây con
Trang 22NLR (Node-Left-Right)
Thứ tự duyệt như sau:
Thăm nút gốc
Thăm các nút của cây con trái
Thăm các nút của cây con phải
Cài đặt:
if (Root != NULL ){
<Xử lý root>; //theo yêu cầu
NLR (root->left); //thăm con trái
NLR (root->right); //thăm con phải
}
Trang 24NLR (Node-Left-Right )
Trang 2525
LNR (Left- Node-Right)
Thăm các nút của cây con trái
Trang 2727
LRN (Left-Right-Node)
Thứ tự duyệt như sau:
Thăm các nút của cây con trái
Thăm các nút của cây con trái
Trang 30LRN (Left-Right-Node)
Tính toán giá trị của biểu thức dựa trên cây biểu thức
(3 + 1)3/(9 – 5 + 2) – (3(7 – 4) + 6) = –13
Trang 31 Việc xây dựng các thao tác trên cây tổng quát phức tạp hơn trên cây nhị phân nhiều
Chuyển cây tổng quát thành cây nhị phân
Trang 32 Qui tắc chuyển:
Giữ lại nút con trái nhất làm nút con trái
Các nút con còn lại chuyển thành nút con phải
Như vậy, trong cây nhị phân mới:
Con trái thể hiện quan hệ cha con
Con phải thể hiện quan hệ anh em trong cây tổng quát ban đầu
Chuyển cây tổng quát về cây nhị phân
Trang 34 Cây nhị phân tương ứng:
Trang 3535
Cách biểu diễn cây nhị phân khác
Có thể lưu thêm thông tin về nút cha:
typedef struct tagTNode
Trang 36Cách biểu diễn cây nhị phân khác
Trang 37Cây nhị phân tìm kiếm
(Binary Search Tree - BST)
Trang 38Cây nhị phân tìm kiếm
Định nghĩa: cây nhị phân tìm kiếm (BST) là cây nhị phân trong đó thỏa mãn: Khóa của nút đang xét:
Lớn hơn khóa của tất cả các nút thuộc cây con trái
Nhỏ hơn khóa của tất cả các nút thuộc cây con phải
Nếu số nút trên cây là N thì chi phí tìm kiếm trung bình chỉ khoảng log2N
Trang 40typedef struct Node
Trang 4141
Các thao tác trên cây
1) Khởi tạo cây
2) Tạo mới 1 nút trên cây
3) Chèn 1 nút vào cây
4) Tạo cây
5) Duyệt cây
6) Tìm kiếm một nút trên cây
7) Xóa một nút khỏi cây
Trang 42 Khởi tạo cây:
Vào: Cây cần khởi tạo
Ra: Cây sau khi đã đwọc khởi tạo
Thực hiện: Cho con trỏ quản lý địa chỉ nút gốc
Trang 43- Đặt các liên kết left, right = NULL;
Các thao tác trên cây
Trang 44Node* CreateNode (DataType x) {
Trang 4545
Thêm một phần tử x vào cây:
Việc thêm một phần tử X vào cây phải bảo đảm điều kiện ràng buộc của cây nhị phân tìm kiếm
• Có thể thêm vào nhiều chỗ khác nhau trên cây, nhưng nếu thêm vào một nút lá sẽ là tiện lợi nhất (có thể thực hiên quá trình tương tự thao tác tìm kiếm)
• Khi chấm dứt quá trình tìm kiếm cũng chính là lúc tìm được chỗ cần thêm
Các thao tác trên cây
Trang 4646
Chèn một nút vào cây:
Vào : - Cây nhị phân tìm kiếm để chèn;
- Nút cần chèn p;
Ra : Cây sau khi được chèn thêm nút p;
B1) Nếu root = NULL thì thực hiện B3;
Ngược lại, thực hiện B2;
B2) Tìm vị trí trống để chèn nút vào cây;
- Nếu root->data = p->data thì thực hiện BKT;
- Nếu p->data > root->data thì đệ quy qt chèn ở cây con phải
- Nếu p->data < root->data thì đệ quy qt chèn ở cây con trái B3 ) root p;
BKT) Kết thúc
Các thao tác trên cây
Trang 4949
void CreateTree (tree &root){
int n;
printf ( “n = “); scanf(“%d”,&n); for ( int i=1; i<=n;i++){
Các thao tác trên cây
Tạo cây nhị phân tìm kiếm: Lặp lại quá trình
thêm 1 phần tử vào một cây rỗng
Trang 51Các thao tác trên cây
Trang 52void NLR (TREE root){
Các thao tác trên cây
Duyệt theo thứ tự trước NLR:
Duyệt nút gốc;
Duyệt cây con bên trái;
Duyệt cây con bên phải;
Trang 5353
void LNR (TREE root){
if (root!=NULL){
LNR (root->left); <Xử lý nút gốc>;
LNR (root->right); }
}
Các thao tác trên cây
Duyệt theo thứ tự giữa LNR:
Duyệt cây con bên trái;
Duyệt nút gốc;
Duyệt cây con bên phải;
Trang 54void LRN (TREE root){
if (root!=NULL){
LRN (root->left); LRN (root->right); <Xử lý nút gốc>;
}
Các thao tác trên cây
Duyệt theo thứ tự sau LRN:
Duyệt cây con bên trái;
Duyệt cây con bên phải;
Duyệt nút gốc;
Trang 56Node * SearchNode ( Tree root, DataType x){
Các thao tác trên cây
Tìm kiếm phần tử trong cây (đệ quy):
Trang 57Các thao tác trên cây
Tìm kiếm phần tử trong cây (không đệ quy):
Trang 58Tìm thấy Số node duyệt: 5 Số lần so sánh: 9
Các thao tác trên cây
Trang 59Tìm thấy Số node duyệt: 5 Số lần so sánh: 9
Các thao tác trên cây
Trang 60 Nhận xét:
Số lần so sánh tối đa phải thực hiện để tìm phần
tử x là h, với h là chiều cao của cây
Như vậy thao tác tìm kiếm trên CNPTK có n nút tốn chi phí trung bình khoảng O(log2n)
Các thao tác trên cây
Trang 62Các thao tác trên cây
Trang 64 Hủy một phần tử có khóa x
- Trường hợp 1 : X là nút lá
Xóa node này
Các thao tác trên cây
Trang 66 Gán liên kết từ cha của
nó xuống con duy nhất của nó
Trang 67Các thao tác trên cây
Ví dụ: hủy nút có giá trị x = 37 trên cây:
Hủy một phần tử có khóa x
- Trường hợp 1 : x là nút lá
Trang 68 Nhận xét:
Không thể hủy trực tiếp do x có đủ 2 con
Hủy gián tiếp:
• Thay vì hủy x, ta sẽ tìm một phần tử thay thế y Phần tử này có tối đa một con
• Thông tin lưu tại y sẽ được chuyển lên lưu tại x
• Sau đó, nút bị hủy thật sự sẽ là Y giống như 2 trường hợp đầu
Vấn đề: chọn Y sao cho khi lưu Y vào vị trí của
Các thao tác trên cây
Hủy một phần tử có khóa x
- Trường hợp 3 : x có đủ 2 con
Trang 6969
Có 2 phần tử thỏa mãn yêu cầu:
Phần tử nhỏ nhất (trái nhất) trên cây con phải
Phần tử lớn nhất (phải nhất) trên cây con trái
Việc chọn lựa phần tử nào là phần tử thay thế mạng hoàn toàn phụ thuộc vào ý thích của người lập trình
Ở đây, ta sẽ chọn phần tử trái nhất trên cây con phải làm phân tử thay thế
Các thao tác trên cây
Trang 70 Tìm w là nút trước nút x trên phép duyệt cây inorder (chính là nút cực phải của cây con bên trái của x)
Trang 72void FindReplNode ( TREE &p, TREE &q)
Các thao tác trên cây
Trang 7373
int DelNode ( TREE &root, DataType X){
if (root== NULL ) return 0;
Trang 74void FindReplNode(Tree &p, Tree &q){
Trang 7575
Hủy cây: Việc toàn bộ cây có thể được thực hiện
thông qua thao tác duyệt cây theo thứ tự sau:
Hủy cây con trái
Hủy cây con phải
Hủy nút gốc.
Các thao tác trên cây
void removeTree ( TREE &root){
Trang 76 Nhận xét:
Tất cả các thao tác SearchNode, InsertNode,
DelNode đều có độ phức tạp trung bình O(h), với h
là chiều cao của cây
Các thao tác trên sẽ có độ phức tạp O(n)
Các thao tác trên cây