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

Báo Cáo CÂY NHỊ PHÂN TÌM KIẾM CÂY AVL

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 (451.9 KB, 42 trang )

A
B
C
D
F
G
E
H
K
Đề Tài Báo Cáo:
Đề Tài Báo Cáo:
CÂY NHỊ PHÂN
TÌM KIẾM
CÂY AVL

Các thành viên trong nhóm:
1. ĐẶNG HỒNG HẠNH
2. HOÀNG NGỌC PHƯƠNG DUNG
3. LÊ TRẦN PHƯƠNG VI
Ngôn ngữ sử dụng: C++
Môi trường làm việc: BORLANDC
Tài liệu tham khảo:
1. Nhập môn cấu trúc dữ liệu và thuật toán
(GS.TS.Hoàng Kiếm)
2. C++ & Lập trình hướng đối tượng
(GS.Phạm Văn Ất)
3. Cấu trúc dữ liệu và thuật giải
(Th.Sĩ Nguyễn Mạnh Cường)
- Nhiệm vụ từng thành viên:
Viết Code: Phương Dung + Hồng Hạnh
Soạn Powerpoint: Phương Dung+Hồng Hạnh+Phương Vi



A
B
C
D
F
G
E
H
K
Phần 1:
Phần 1:
CÂY NHỊ PHÂN
TÌM KIẾM

Định nghĩa

Cây nhị phân tìm kiếm

Cây nhị phân: là cây mà tại mỗi nút có tối đa 2 con

Có một node gọi là gốc (root) và 2 cây con gọi là
cây con trái và cây con phải

Giá trị của những nút bên trái nhỏ hơn giá trị của
những nút bên phải.

Ví dụ:

Cây rỗng:


Cây có 1 node: là node gốc

Cây có 2 node:

Ví dụ CNP:
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41

Khai báo CNP:
typedef struct TagNode
{
int info;
struct TagNode *pL,*pR;
int x,y;
}tNode,Node,*pNode;
typedef tNode *tree;



Các thao tác:

Nhập xuất cây.

Thêm phần tử X trong cây.

Tìm phần tử X trong cây.

Hủy phần tử X trong cây.

Đếm số nút của cây.

Đếm số lá của cây.

Đếm số nút có 1 con.

Đếm số nút có 2 con.

Chiều cao của cây.

Hủy toàn bộ cây NPTK.

Phép duyệt cây

Duyệt qua từng node của cây (mỗi node 1
lần)

Cách duyệt:
1.NLR (Tiền thứ tự)

2.LNR(Trung thứ tự)
3.LRN(hậu thứ tự)

1.NLR(Tiền thứ tự)
void NLR(TREE T)
{
if(T!=NULL)
{
cout<<T->Info<<" ";//thamnut T
NLR(T->pLeft);
NLR(T->pRight);
}
}

Phép duyệt cây_ NLR:
20
8
3
1 5
4
15
9 16
12
26
21
25
22
29
28
20Kết quả: 8 3 1 5 4 15 9 12 16 26 21 25 22 29

28

2. NLR(Trung thứ tự)
void LNR(TREE T)
{
if(T!=NULL)
{
LNR(T->pLeft);
cout<<T->Info<<" ";//thamnut T
LNR(T->pRight);
}
}

Phép duyệt cây_LNR
15
6
3
1 5
4
10
7 13
8
21
16
19
18
25
22
1Kết quả: 3 4 5 6 7 8 10
131516 18 19 21 22 25


3.LRN (Hau thu tu)
void LRN(TREE T)
{
if(T!=NULL)
{
LRN(T->pLeft);
LRN(T->pRight);
cout<<T->Info<<" ";//thamnut T
}
}

Ví dụ về phép duyệt cây LRN
15
8
3
1 5
4
12
9 13
11
25
19
18
16
29
26
1Kết quả: 4 5
3 11 9 13 12 8 16 18 19 26 29 25
15


Tìm kiếm trên CNP:

Chọn hướng tìm theo tính chất của CNP:

So sánh với node gốc, nếu đúng thì tìm thấy

Tìm bên nhánh trái (hay phải) nếu khóa cần tìm nhỏ
hơn (hay lớn hơn) khóa của node gốc
tNode *SearchNode(tree T,int X)
{
if(T)
{
if(T->info==X)
return T;
if(T->info>X)
return SearchNode(T->pL,X);
else
return SearchNode(T->pR,X);
}
return NULL;
}

Giải thuật tìm kiếm trên BST
Algorithm searchNode
Input: T là node gốc và X là khóa cần tìm
Output: node tìm thấy
1. if (cây rỗng)
1.1. return -1 //khong tim thay
2. if (X trùng khóa với T)

2.1. return 1 // tim thay
3. if (X có khóa nhỏ hơn khóa của T)
3.1. Tìm bên nhánh trái của T
4. else
4.1. Tìm bên nhánh phải của T
End searchNode

Ví dụ tìm kiếm trên CNP
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tìm kiếm 13
Khác nhau
Giống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tìm thấy
Số node duyệt: 5
Số lần so sánh: 9

Ví dụ tìm kiếm trên CNP

25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tìm kiếm 14
Khác nhau
Node gốc nhỏ hơnNode gốc lớn hơn
Không tìm thấy
Số node duyệt: 5
Số lần so sánh: 10

Giải thuật thêm vào CNP:
NHẬP: node gốc và dữ liệu cần thêm vào
XUẤT: CNP sau khi thêm vào
1. if (cây rỗng)
1.1. Thêm vào tại vị trí này
2. if (dl trùng khóa với nút gốc)
2.1. return 0
3. if (dl có khóa nhỏ hơn khóa của nút gốc)
3.1. Thêm vào bên nhánh trái của nút gốc

4. else
4.1. Thêm vào bên nhánh phải của nút gốc
End.

Giải thuật thêm vào CNP
int InsertNode(tree &T,int gt)
{
y+=1;
if(T){
if(T->info ==gt)//cout<<"du lieu da co";
return 0;
else if(gt< T->info){
x-=(getmaxx()/(y*4)+1);
if(x<0) x = 15;
InsertNode(T->pL,gt);}
else{
x+=(getmaxx()/(y*4)+1);
if(x>getmaxx()){
x = getmaxx()-15;}
InsertNode(T->pR,gt);
}
}
else {
T = GetNode(gt);
return 1;
}
}

Thêm vào CNP:


I/ Xóa nút p không là gốc:
1/ p không có con trái hoặc phải:
1. Gán liên kết từ cha của p
xuống con duy nhất của p
2. Xóa p
3
1
2
3
2

2/ p có con trái và con phải
1. Tìm w là node trước node x trên phép duyệt cây trung thứ
tự (chính là node cực phải của cây con bên trái của x)
2. Thay x bằng w
3. Xóa node w cũ (giống trường hợp 1 hoặc 2 đã xét)

II/ Xóa p là nút gốc
1/ p không có con trái và phải
delete p;T=NULL;
p
NULL
NULL

2/ T không có con trái hoặc con phải(xóa tương
tự như trường hợp I/.1)
3/ T có con trái và con phải(xóa tương tự
trường hợp I/.2)

×