Tree Structure
2008
1
Nộ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
Phần mở rộng (cây n-phân)
2008
Cây Top-Down
B-Tree
2
Cấu trúc dữ liệu
2008
3
Cấ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:
2008
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
4
Cấu trúc cây
Sao trong máy
tính, cây lại
thể hiện
ngược?
2008
5
Khái niệm
Cạnh
nút
Z
B
Q
2008
gốc
J
A
R
K
D
A
F
L
Lá
6
Khá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á
Nút gốc
Nút trong
Chiều cao
Nút lá
2008
7
Khái niệm
Root
Node A
Node C
Node H
Node B
Node D
Node E
Node I
Node F
Node J
Node G
Node K
Node L
Cây con
2008
Nút anh em
8
Nội dung
2008
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
9
Binary 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
2008
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á
10
Binary Tree
Kích thước = 9 (số nút)
Mức 0
A
Cây con phải
Cây con trái
Mức 1
Mức 2
Mức 3
2008
B
D
C
E
H
F
I
G
Độ sâu/chiều cao = 3
11
Binary 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
B
D
E
H
2008
C
F
I
G
J
K
12
Binary Tree
Cây nhị phân đầy đủ với chiều sâu d
Phải là cây nhị phân đúng
Tất cả nút lá có chiều sâu d
A
Số nút = (2 -1)
Số nút trung gian = ?
Biết số nút tính d của cây NP đầy đủ
d+1
B
D
2008
C
E
F
13
G
Binary 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
2008
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
14
Binary Tree
PreOrder:
InOrder:
PostOrder:
A
B
D
E
H
2008
C
F
I
G
J
K
15
Binary 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;
NodePtr
2008
pTree;
Chứa thông tin của nút
Cấu trúc của một nút
Trỏ đến nút con phải
Trỏ đến nút con trái
Trỏ nút gốc của cây NP
16
Binary Tree
pTree
Con trỏ pTree trỏ
đến nút gốc của cây
8
5
1
3
9
2008
10
4
20
7
17
Binary Tree
Các thao tác:
NewNode, CreateNode, FreeNode, Init, IsEmpty
InsertLeft, InsertRight
DeleteLeft, DeleteRight
PreOrder, InOrder, PostOrder
Phần minh
Search
hoạ dùng
ClearTree
DataType là
kiểu int
2008
18
Binary Tree
Create
Crea Node: tạo một nút mới có giá trị là x
NodePtr CreateNode(int x)
{
NodePtr node;
node = NewNode();
node->info = x;
node->left = NULL;
node->right = NULL;
return node;
}
2008
node
new
X
19
Binary 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;
}
2008
20
Binary 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;
}
2008
21
Binary Tree
DeleteLeft: xoá nút con bên trái của p, nút này
phải là nút lá
int DeleteLeft(NodePtr p)
{
NodePtr q;
int value;
if (p == NULL) return -1;
q = p->left;
if (q == NULL) return -1;
if (q->left != NULL || q->right !=NULL)
return -1;
value = q->info;
p->left = NULL;
FreeNode(q);
return value;
}
2008
22
Binary 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);
}
}
2008
23
Binary Tree
InOrder
void InOrder(NodePtr pTree)
{
if (pTree != NULL)
{
InOrder(pTree->left);
printf(“%d ”, pTree->info);
InOrder(pTree->right);
}
}
2008
24
Binary Tree
PostOder
void PostOrder(NodePtr pTree)
{
if (pTree != NULL)
{
PostOrder(pTree->left);
PostOrder(pTree->right);
printf(“%d ”, pTree->info);
}
}
2008
25