Download as pdf or txt
Download as pdf or txt
You are on page 1of 37

DATA STRUCTURES & ALGORITHMS

Giảng viên: ThS. Trần Vũ Đại


Mobile: 0986.409966
Email: vudai81@mail.com
Cây là gì? 2

Cây (Tree) là một cấu trúc dữ liệu giống như danh sách liên
kết nhưng khác ở chỗ mỗi node trên cây trỏ đến nhiều node
khác
Cây là cấu trúc dữ liệu không tuyến tính
Một số khái niệm cơ bản 3

Root (gốc) của cây là node không có node cha, mỗi cây chỉ có
duy nhất 1 root.
Edge (cạnh) là đường nối từ node cha đến node con
Leaf (lá) là các node không có node con
Siblings (các node anh em) cùng là con của một node cha
Ancestor (node trước) nút p gọi là nút trước của nút q nếu tồn
tại một đường dẫn (path) từ root đến q và đi qua p
Tập hợp tất cả các node tại một độ sâu nhất định gọi là bậc
(level) của cây. Nút gốc có bậc là 0.
Một số khái niệm cơ bản 4

Depth (độ sâu của một node) là độ dài của đường dẫn từ nút
gốc đến node đó
Chiều cao (height) của một node là độ dài của đường dẫn từ
nút đó đến nút sâu nhất
Chiều cao (height) của một cây là độ dài của đường dẫn từ
nút gốc đến nút sâu nhất
Độ lớn (size) của một node là số node tính từ node đó đến
các node sau nó
Cây nhị phân 5

Một cây được gọi là cây nhị phân nếu mỗi node của cây có: 0
hoặc 1 hoặc 2 node con
Các loại cây nhị phân 6

Strict Binary Tree: là cây nhị phân mà mỗi node trên cây có
chính xác 2 node con hoặc không có node con nào
Các loại cây nhị phân 7

Full Binary Tree (cây nhị phân đầy đủ): là cây nhị phân mà
mỗi node trên cây có chính xác 2 node con và tất cả các node
lá (leaf) có cùng bậc (level)
Các loại cây nhị phân 8

Complete Binary Tree (cây nhị phân hoàn chỉnh): là cây nhị
phân mà tất cả các level (bậc) của nó đều được lấp đầy hoàn
toàn bởi các nodes, nhưng có thể ngoại trừ level cuối cùng và
level cuối cùng có tất cả các nodes càng nằm ở bên trái càng
tốt
Các thuộc tính của Binary Tree 9

Số node của một cây nhị phân đầy đủ: n = 2h+1 – 1
Số node của một cây nhị phân hoàn chỉnh: 2h < n < 2h+1 – 1
Số node lá của một cây nhị phân đầy đủ: 2h
Cây nhị phân | Binary Tree 10

Cấu trúc của một cây nhị phân


struct BinaryTreeNode{
int Data;
BinaryTreeNode *Left;
BinaryTreeNode *Right;
};
Cây nhị phân | Binary Tree 11

Các thao tác cơ bản trên cây nhị phân


Insert: Thêm một phần tử vào cây
Delete: Xóa một phần tử trên cây
Search: Tìm phần tử
Trarseve: Duyệt cây
Cây nhị phân | Binary Tree 12

Ứng dụng của Binary Tree


Mục lục của một cuốn sách với phần, chương, bài, mục.
Cấu trúc thư mục trên đĩa: thư mục gốc có thể coi là gốc của cây đó
với các cây con là các thư mục con và tập tin nằm trên thư mục gốc.
Gia phả của một dòng họ.
Một biểu thức số học gồm các phép toán cộng, trừ, nhân, chia cũng
có thể lưu trữ trong 1 cây mà các toán hạng được lưu trữ ở các nút
lá, các toán tử được lưu trữ ở các nút nhánh, mỗi nhánh là 1 biểu
thức con.
Cây nhị phân | Binary Tree 13

Ứng dụng của Binary Tree


Minh họa cây biểu diễn biểu thức (A / B + C) * (D – E)
Cây nhị phân | Binary Tree 14

Các phép duyệt cây


Duyệt theo thứ tự trước (preorder traversal)
Duyệt theo thứ tự giữa (inorder traversal)
Duyệt theo thứ tự sau (postorder traversal)
Cây nhị phân | Binary Tree 15

Duyệt theo thứ tự trước (preorder traversal)


Thăm (visit) nút gốc
Duyệt cây con bên trái theo thứ tự trước (preorder)
Duyệt cây con bên phải theo thứ tự trước (preorder)
Cây nhị phân | Binary Tree 16

Duyệt theo thứ tự trước (preorder traversal)


void pre_order(struct BinaryTreeNode *root){
if(root != NULL){
cout << root->Data; //Thăm gốc
pre_order(root->Left); //Cây con trái
pre_order(root->Right); //Cây con phải
};
Cây nhị phân | Binary Tree 17

Duyệt theo thứ tự giữa (inorder traversal)


Duyệt cây con bên trái theo thứ tự giữa (inorder)
Thăm (visit) nút gốc
Duyệt cây con bên phải theo thứ tự giữa (inorder)
Cây nhị phân | Binary Tree 18

Duyệt theo thứ tự trước (preorder traversal)


void in_order(struct BinaryTreeNode *root){
if(root != NULL){
in_order(root->Left);
cout << root->Data;
in_order(root->Right);
};
Cây nhị phân | Binary Tree 19

Duyệt theo thứ tự sau (postorder traversal)


Duyệt cây con bên trái theo thứ tự sau (postorder)
Duyệt cây con bên phải theo thứ tự sau (postorder)
Thăm (visit) nút gốc
Cây nhị phân | Binary Tree 20

Duyệt theo thứ tự sau (postorder traversal)


void in_order(struct BinaryTreeNode *root){
if(root != NULL){
in_order(root->Left);
in_order(root->Right);
cout << root->Data;
}
};
Cây nhị phân tìm kiếm | Binary Search Tree 21

Cây nhị phân tìm kiếm (BST) là cây nhị phân mà thỏa tính
chất sau: Tất cả các phần tử cây con trái (left subtree) có giá
trị nhỏ hơn node gốc và nhỏ hơn tất cả các phần tử cây con
phải (right subtree). Nghĩa là:
Giá trị của các node ở cây con trái phải nhỏ hơn giá trị của node
gốc
Giá trị của các node ở cây con phải phải lớn hơn giá trị của node
gốc
Cây con trái và cây con phải đều phải là cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm | Binary Search Tree 22

Minh họa cây nhị phân tìm kiếm


Cây nhị phân tìm kiếm | Binary Search Tree 23

Bài tập: Vẽ cây nhị phân tìm kiếm theo thứ tự nhập từ trái
sang phải và duyệt cây theo thứ tự trước?
a) 27; 19; 10; 21; 35; 25; 41; 12; 46; 7
b) H (72); B (66); C (67); A (65) ; E (69); D (68); Z (90); M (77);
P (80); T (84)
Vẽ hình trên trang draw.io (search google)
Cây nhị phân tìm kiếm | Binary Search Tree 24

Các thao tác trên cây nhị phân tìm kiếm


Tìm kiếm (search): Tìm phần tử bất kỳ, Tìm phần tử lớn nhất, tìm
phần tử nhỏ nhất
Thêm (insert): Thêm một phần tử vào cây
Xóa (delete): Xóa một phần tử trên cây
Cây nhị phân tìm kiếm | Binary Search Tree 25

Tìm phần tử X trên cây BST


Bắt đầu duyệt từ gốc (root)
Nếu data = X thì return trả về kết quả
Nếu data < X thì tiếp tục tìm cây con bên trái (left subtree)
Nếu data > X thì tiếp tục tìm cây con bên phải (right subtree)
Nếu không tìm thấy trả về NULL
Cây nhị phân tìm kiếm | Binary Search Tree 26

Tìm phần tử X trên cây BST


void find(struct BinaryTreeNode *root, int key){
if(root == NULL){
cout << “Khong Tim Thay!”;
return;
}
if(key < root->Data)
find(root->Left, key);
else if(key > root->Data)
find(root->Right, key);
cout << “Tim Thay Node: ” << root->Data;
};
Cây nhị phân tìm kiếm | Binary Search Tree 27

Tìm phần tử nhỏ nhất trên cây BST


Phần tử nhỏ nhất là node nằm bên trái cùng và node này không có
node con trái
void find_min(struct BinaryTreeNode *root){
if(root == NULL){
cout << “Khong Tim Thay!”;
return;
}
else if(root->Left == NULL)
cout << “Node Nho Nhat: ” << root->Data;
else
find_min(root->Left);
};
Cây nhị phân tìm kiếm | Binary Search Tree 28

Tìm phần tử nhỏ nhất trên cây BST


Cây nhị phân tìm kiếm | Binary Search Tree 29

Tìm phần tử lớn nhất trên cây BST


Phần tử lớn nhất là node nằm bên phải cùng và node này không có
node con phải
void find_max(struct BinaryTreeNode *root){
if(root == NULL){
cout << “Khong Tim Thay!”;
return;
}
else if(root->Right == NULL )
cout << “Node Lon Nhat: ” << root->Data;
else
find_max(root->Right);
};
Cây nhị phân tìm kiếm | Binary Search Tree 30

Tìm phần tử lớn nhất trên cây BST


Cây nhị phân tìm kiếm | Binary Search Tree 31

Thêm một phần tử vào cây BST: Đầu tiên, ta phải tìm vị trí để
thêm phần tử, trong quá trình tìm vị trí nếu đã có phần tử có
cùng giá trị ở vị trí đó rồi thì bỏ qua, nếu không thì thêm phần
tử đó vào
Cây nhị phân tìm kiếm | Binary Search Tree 32

Thêm một phần tử vào cây BST:


void insert(struct BinaryTreeNode *root, int key){
if(root == NULL){
BinaryTreeNode root = new BinaryTreeNode;
root->Data = key;
root->Left = root->Right = NULL;
} else{
if(key < root->Data)
root->Left = insert(root->Left, key);
else
root->Right = insert(root->Right, key);
}
};
Cây nhị phân tìm kiếm | Binary Search Tree 33

Xóa một phần tử trên cây BST: Xóa một phần tử trên cây BST:
Đầu tiên, ta phải tìm vị trí phần tử muốn xóa. Khi tìm thấy thì:
Nếu node xóa là node lá (leaf): Cập nhật NULL cho node cha
Nếu node xóa là node con (child): Gán node con của node hiện tại
cho node cha
Nếu node xóa có 2 node con: thay thế giá trị của node cần xóa với
phần tử lớn nhất của cây con trái và đệ qui để xóa node đó
Cây nhị phân tìm kiếm | Binary Search Tree 34

Xóa một phần tử trên cây BST:

Trường hợp 1 Trường hợp 2


Cây nhị phân tìm kiếm | Binary Search Tree 35
Trường hợp 3
Cây nhị phân tìm kiếm | Binary Search Tree 36

LestMostChild:
37

You might also like