Bài giảng Cấu trúc dữ liệu và giải thuật - Chương 5.2: Tree structure. Những nội dung chính được trình bày trong chương này gồm có: Cấu trúc cây, cây nhị phân, cây nhị phân tìm kiếm, cây nhị phân tìm kiếm cân bằng AVL. Mời các bạn cùng tham khảo.
Trang 1Tree Structure
ThS Nguyễn Hà Giang
Trang 2Nội dung
Cấu trúc cây
Cây nhị phân
Cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm cân bằng AVL
Trang 3Cấu trúc dữ liệu
Trang 4Cấu trúc cây
Tập hợp các nút và cạnh nối các nút đó
Có một nút gọi là gốc
Quan hệ one-to-many giữa các nút
Có duy nhất một đường đi từ gốc đến một nút
Các loại cây:
Nhị phân: mỗi nút có {0,1, 2} nút con
Tam phân: mỗi nút có {0,1,2,3} nút con
n-phân: mỗi nút có {0,1, ,n} nút con
Trang 5Cấu trúc cây
Sao trong máy tính, cây lại thể hiện ngược?
Trang 6Khái niệm
J
DR
B
LF
AK
Q
Lá
nút gốc
Cạnh
Trang 7Khái niệm
Thuật ngữ
Nút gốc: không có nút cha
Nút lá: không có nút con
Nút trong: không phải nút con và nút gốc
Chiều cao: khoảng cách từ gốc đến lá
Chiều caoNút gốc
Nút trong
Trang 8Khái niệm
RootNode A
Node H
Node B
Node GNode F
Node ENode D
Node C
Node KNode J
Node LNode I
Trang 9Nội dung
Cấu trúc cây
Cây nhị phân
Cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm cân bằng AVL
Trang 10Binary Tree
Cấu trúc cây đơn giản nhất
Tại mỗi nút gồm các 3 thành phần
Phần data: chứa giá trị, thông tin…
Liên kết đến nút con trái (nếu có)
Liên kết đến nút con phải (nếu có)
Cây nhị phân có thể rỗng (ko có nút nào)
Cây NP khác rỗng có 1 nút gốc
Có duy nhất 1 đường đi từ gốc đến 1 nút
Nút không có nút con bên trái và con bên phải là nút lá
Trang 12Binary Tree
Cây nhị phân đúng:
Nút gốc và nút trung gian có đúng 2 con
Cây nhị phân đúng có n nút lá thì số nút trên cây 2n-1
A
Trang 13Binary Tree
Cây nhị phân đầy đủ với chiều sâu d
Phải là cây nhị phân đúng
Trang 14Binary Tree
Duyệt cây:
Do cây là cấu trúc ko tuyến tính
3 cách duyệt cây NP
Duyệt theo thứ tự trước PreOrder: NLR
Duyệt theo thứ tự giữa InOrder: LNR
Duyệt theo thứ tự sau PostOrder: LRN
Trang 16Binary Tree
Cài đặt cây NP dùng liên kết
typedef struct node
{
DataType info;
struct node * left;
struct node * right;
} NODE;
typedef NODE * NodePtr;
Cấu trúc của một nút
Chứa thông tin của nút
Trỏ đến nút con tráiTrỏ đến nút con phải
Trang 17pTree
Con trỏ pTree trỏ
đến nút gốc của cây
Trang 20Binary Tree
InsertLeft: thêm nút con bên trái nút p
int InsertLeft(NodePtr p, int x)
{
if (p == NULL) return FALSE;
if (p->left != NULL) return FALSE;
p->left = CreateNode(x);
return TRUE;
}
Trang 21Binary Tree
InsertRight: thêm một nút con bên phải p
int InsertRight(NodePtr p, int x)
{
if (p == NULL) return FALSE;
if (p->right != NULL) return FALSE;
p->right = CreateNode(x);
return TRUE;
}
Trang 23Binary Tree
PreOrder: xuất theo thứ tự trước
void PreOrder(NodePtr pTree)
{
if (pTree != NULL){
printf(“%d ”, pTree->info);
PreOrder(pTree->left);
PreOrder(pTree->right);
}}
Trang 24printf(“%d ”, pTree->info);
InOrder(pTree->right);
}}
Trang 25PostOrder(pTree->right);
printf(“%d ”, pTree->info);
}}
Trang 26if (pTree == NULL) return NULL;
if (pTree->info == x) return pTree;
Trang 27ClearTree(pTree->right);
FreeNode(pTree);
}}
Trang 28 Xác định độ sâu/chiều cao của cây
Tìm giá trị nhỏ nhất/lớn nhất trên cây
Tính tổng các giá trị trên cây
Đếm số nút có giá trị bằng x
Trang 29Nội dung
Cấu trúc cây
Cây nhị phân
Cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm cân bằng AVL
Trang 30Binary Search Tree
BST là cây nhị phân mà mỗi nút thoả
Giá trị của tất cả nút con trái < nút gốc
Giá trị của tất cả nút con phải > nút gốc
5 3
10
Trang 31Binary Search Tree
25 45
Trang 32Binary Search Tree
Trang 33Binary Search Tree
Trang 34Binary Search Tree
Trang 35Binary Search Tree
Thời gian tìm kiếm
Dựa trên chiều cao của cây
Trang 36Binary Search Tree
Search
Xuất phát từ gốc
Nếu nút = NULL => ko tìm thấy
Nếu khoá x = khóa nút gốc => tìm thấy
Ngược lại nếu khoá x < khoá nút gốc => Tìm trên cây bên trái
Ngược lại => tìm trên cây bên phải
Trang 37Binary Search Tree
Trang 38Binary Search Tree
Xây dựng cây BST
Chèn
Xóa
Luôn duy trì tính chất
Giá trị nhỏ hơn ở bên cây con trái
Giá trị lớn hơn ở bên cây con phải
Trang 39Binary Search Tree
Insert
Thực hiện tìm kiếm giá trị x
Tìm đến cuối nút Y ( nếu x ko
tồn tại trong cây)
Nếu x < y, thêm nút lá x bên trái
Trang 40Binary Search Tree
void Insert(NodePtr pTree, int x) {
Insert(pTree->left, x);
} else
if (pTree->right == NULL) {
node = CreateNode(x);
pTree->right = node;
} else
Insert(pTree->right, x);
}
Trang 41Binary Search Tree
Delete: xóa nhưng phải đảm bảo vẫn là cây BST
Thực hiện tìm nút có giá trị x
Nếu nút là lá, delete nút
Ngược lại
Thay thế nút bằng một trong hai nút sau
Y là nút lớn nhất của cây con bên trái
Z là nút nhỏ nhất của cây con bên phải
Delete nút Y hoặc Z đã thay thế giá trị tương ứng
Trang 42Binary Search Tree
Trang 43 Trường hợp 2: p chỉ có 1 cây con, chọn nút
con làm nút thế chỗ nút cha, sau đó xóa nút
Trang 44Binary Search Tree
Trường hợp 3: nút p có 2 cây con, chọn nút
thay thế theo 1 trong 2 cách như sau
Nút lớn nhất trong cây con bên trái
Nút nhỏ nhất trong cây con bên phải
Trang 45Binary Search Tree
Trang 46Binary Search Tree