Tải bản đầy đủ (.ppt) (18 trang)

Thuật toán cây nhị phân ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (329.68 KB, 18 trang )

CÂY NHỊ PHÂN
TMT
1
CÁ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
X F
H I
D E
G
Y
B
A
C
X F
H I
D E
G
Y
CÁ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
F
G
N O
D
E
J
K
L
M
H I
B
A
C
F
G
N O
D
E
J
K
L
M
H I
ĐẶ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
7
7
3
3
36
36
1
1
6
6
15
15
40
40
23

23
4
4
4

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
E
F
I J
D
G H
B
A
C
E
F
I J
D
G H


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
E F
I
E D
H
H
B
A
C
E F
I
E D
H
H
Nút
ĐỊ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
TNODE
Key
pLeft pRight
7
KHAI BÁO CÂY NHỊ
typedef struct Node
{
int Key;
struct Node *Left, *Right;
} *Tree;
8
XÂ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
Ví dụ: có dãy số 20, 70, 30, 25, 35, 50, 80, 40, 60, 10
10
Ví dụ: có dãy số 20, 70, 30, 25, 35, 50, 80, 40, 60, 10
11
DUYỆT CÂY
Thứ tự trước (NLR)
Thứ tự giữa (LNR)
Thứ tự sau (LRN)
……
12
NLR

7 L7 R7
7 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
7
7
3
3
36
36
1
1
6
6
15
15
40
40
23
23
4
4
13
NLR
Tạ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)
void NLR (TREE t)
{
{
if(t!=NULL)
if(t!=NULL)
{
{
cout<<t->Key<<“\t”;
cout<<t->Key<<“\t”;
NLR(t->pLeft);
NLR(t->pLeft);
NLR(t->pRight);
NLR(t->pRight);
}
}
}
}
14
LNR
L7 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
7
7
3
3
36
36
1
1
6
6
15
15
40
40
23
23
4
4
15
LNR
Tạ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
LRN
L7 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
7
7
3
3
36
36
1
1
6
6
15
15
40
40

23
23
4
4
17
LRN
Tạ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

×