Các loại cây nhị phân a/ Cây nhị phân đúng Strictly Binary Tree: Tất cả các nút đều có đúng hai con ngoại trừ nút lá... CÁC KHÁI NIỆMb/ Cây nhị phân đầy Complete Binary Tree: là cây nh
Trang 1CÂY NHỊ PHÂN
TMT
1
Trang 2CÁC KHÁI NIỆM
1 Cấu trúc cây nhị phân
2 Các loại cây nhị phân
a/ Cây nhị phân đúng (Strictly Binary
Tree): Tất cả các nút đều có đúng hai con (ngoại trừ nút lá)
2
B
A
C
B
A
C
Trang 3CÁC KHÁI NIỆM
b/ Cây nhị phân đầy (Complete Binary Tree): là cây nhị phân đúng và tất cả các nút lá ở cùng mức
3
B
A
C
B
A
C
Trang 4ĐẶC ĐIỂM CÂY NHỊ PHÂN TÌM KIẾM
Là cây nhị phân
Giá trị của một node bất kỳ luôn lớn hơn giá trị của tất cả các node bên trái và nhỏ hơn giá trị tất cả các node bên phải
Nút có giá trị nhỏ nhất nằm ở trái nhất của cây
Nút có giá trị lớn nhất nằm ở phải nhất của cây
7 7
23 4
4
Trang 5 Cây nhị phân cân bằng (AVL): Một cây
nhị phân được gọi là cây nhị phân cân bằng nếu và chỉ nếu đối với mọi nút của cây thì chiều cao của cây con bên trái
và chiều cao của cây con bên phải hơn kém nhau nhiều nhất là 1 (Theo Adelson - Velski và Landis)
5
B
A
C
D
B
A
C
D
Trang 6 Cây nhị phân cân bằng hoàn toàn:
Một cây nhị phân được gọi là cây nhị phân cân bằng hoàn toàn nếu và chỉ nếu đối với mọi nút của cây thì số nút của cây con bên trái và số nút của cây con bên phải hơn kém nhau nhiều nhất là 1
6
B
A
C
I
H
H
B
A
C
I
H
H
Trang 7ĐỊNH NGHĨA KIỂU DỮ LIỆU
typedef struct Node {
<Data> Key;
struct Node *Left, *Right;
} *Tree;
Giá trị
Trỏ trái Trỏ phải
pLeft pRight
Trang 8KHAI BÁO CÂY NHỊ
typedef struct Node
{
int Key;
struct Node *Left, *Right;
} *Tree;
8
Trang 9XÂY DỰNG CÂY
Ví dụ: có dãy số 20, 70, 30, 25, 35, 50, 80, 40,
60, 10
(3 trường hợp gốc là 50, gốc là, 10 hay gốc là 80)
9
Trang 10Ví dụ: có dãy số 20, 70, 30, 25, 35, 50, 80, 40, 60, 10
10
Trang 11Ví dụ: có dãy số 20, 70, 30, 25, 35, 50, 80, 40, 60, 10
11
Trang 12DUYỆT CÂY
Thứ tự trước (NLR)
Thứ tự giữa (LNR)
Thứ tự sau (LRN)
……
12
Trang 137 3 L3 R3 36 L36 R36
7 3 1 6 L6 36 15 R15 40
7 3 1 6 4 36 15 23 40
7 7
23 4
13
Trang 14Tại node t đang xét,
nếu khác rỗng thì
In giá trị của t
Duyệt cây con bên
trái của t theo thứ tự
NLR
Duyệt cây con bên
phải của t theo thứ tự
NLR
void NLR (TREE t) {
if(t!=NULL) {
cout<<t->Key<<“\t”; NLR(t->pLeft);
NLR(t->pRight);
} }
14
Trang 15L7 7 R7
L3 3 R3 7 L36 36 R36
1 3 L6 6 7 15 R15 36 40
1 3 4 6 7 15 23 36 40
7 7
23 4
15
Trang 16Tại node t đang xét, nếu
khác rỗng thì
Duyệt cây con bên trái
của t theo thứ tự LNR
In giá trị của t
Duyệt cây con bên
phải của t theo thứ tự
LNR
void LNR (TREE t) {
if(t!=NULL) {
LNR(t->pLeft);
cout<<t->Key<<“ “; LNR(t->pRight);
} }
16
Trang 17L7 R7 7
L3 R3 3 L36 R36 36 7
1 L6 6 3 R15 15 40 36 7
1 4 6 3 23 15 40 36 7
7 7
23 4
17
Trang 18Tại node t đang xét, nếu
khác rỗng thì
Duyệt cây con bên trái
của t theo thứ tự LRN
Duyệt cây con bên phải
của t theo thứ tự LRN
In giá trị của t
void LRN (TREE t) {
if(t!=NULL) {
LRN(t->pLeft);
LRN(t->pRight);
cout<<t->Key<<“ “;
} }
18