Định nghĩa 2: Cây được định nghĩa đệ qui như sau
1. Một nút là một cây và nút này cũng là gốc của cây.
2. Giả sử T1, T2, ,Tn (n ≥ 1) là các cây có gốc tươn gứng r1, r2, , rn. Khi đó cây T với gốc r được hình thành bằng cách cho r trở thành nút cha của các nút r1, r2, , rnKhoa KTCN Trường ĐH KTKT B.Dương
45 trang |
Chia sẻ: haohao89 | Lượt xem: 2438 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng chương 4: Cây nhị phân, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1Chương 4
CÂY NHỊ PHÂN
4.1. Cấu trúc cây
4.1.1. ðịnh nghĩa
4.1.2. Một số khái niệm cơ bản
4.2. Cây nhị phân
4.2.1. ðịnh nghĩa
4.2.2. Một số tính chất của cây nhị phân
4.2.3. Biểu diễn cây nhị phân
4.2.3. Duyệt cây nhị phân
4.3. Cây nhị phân tìm kiếm
4.3.1. Cây nhị phân tìm kiếm
4.3.2. Các thao tác trên cây nhị phân tìm kiếm
4.4. Bài tập
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
24.1 Cấu Trúc Cây
4.1.1. ðịnh nghĩa cây
4.1.2. Một số khái niệm cơ bản
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
34.1.1. ðịnh nghĩa cây
ðịnh nghĩa 1: Một cây là tập hợp hữu hạn các nút trong
ñó có một nút ñặc biệt gọi là gốc (root). Giữa các nút có
một quan hệ phân cấp gọi là "quan hệ cha con".
Nút gốc
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
Nút gốc
r1 r2
r
T1
T2
ðịnh nghĩa 2: Cây ñược ñịnh nghĩa ñệ qui như sau
1. Một nút là một cây và nút này cũng là gốc của cây.
2. Giả sử T1, T2, …,Tn (n ≥ 1) là các cây có gốc tương
ứng r1, r2,…, rn. Khi ñó cây T với gốc r ñược hình thành
bằng cách cho r trở thành nút cha của các nút r1, r2,…, rn
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
4
4.1.2. Một số khái niệm cơ bản
Bậc của một nút: Là số con của nút ñó
Bậc của một cây: Là bậc lớn nhất của các nút có trên
cây ñó (số cây con tối ña của một nút thuộc cây). Cây có
bậc n thì gọi là cây n - phân
Cây bậc 2 hay còn gọi là cây nhị phân
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
5
Nút gốc: Là nút có không có nút cha
Nút lá: Là nút có bậc bằng 0
Nút nhánh: Là nút có bậc khác 0 và không phải là nút gốc
Nút gốc
Nút lá
Nút nhánh
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
6
Mức của một nút
Mức (gốc (T0)) =0
Gọi T1, T2,..., Tn là các cây con của T0.
Khi ñó Mức (T1) = Mức (T2) = ... = Mức (Tn) = Mức (T0) +1
Chiều cao của cây: Là số mức lớn nhất có trên cây ñó
Cây có chiều cao là 3
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
7
ðường ñi: Dãy các ñỉnh n1,n2, ...,nk gọi là ñường ñi
nếu ni là cha của ni+1 (1 ≤ i ≤ k-1
ðộ dài của ñường ñi: Là số nút trên ñường ñi -1
ðộ dài ñường ñi là 3
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
8
Cây ñược sắp – Cây có thứ tự: Trong một cây, nếu
các cây con của mỗi ñỉnh ñược sắp theo một thứ nhất
ñịnh, thì cây ñược gọi là cây ñược sắp (cây có thứ tự).
A
B C
5
3 8
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
9
4.2. Cây Nhị Phân
4.2.1. ðịnh nghĩa
4.2.2. Một số tính chất của cây nhị phân
4.2.3. Biểu diễn cây nhị phân
4.2.4. Duyệt cây nhị phân
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
10
Cây nhị phân là cây mà mỗi nút có tối ña hai cây con. ðối
với cây con của một nút có phân biệt cây con trái và cây
con phải.
4.2.1. ðịnh Nghĩa
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
11
4.2.1. Một Số Tính Chất Của Cây Nhị Phân
Số lượng tối ña các nút có ở mức i: 2i (i ≥ 0)
Số nút lá tối ña trên cây có chiều cao h la: 2h
Số lượng nút tối ña của cây có chiều cao h: 2h+1-1(h≥1 )
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
12
13
4.2.3 Biễu Diễn Cây Nhị Phân
Lưu trữ kế tiếp
Phương pháp tự nhiên nhất ñể biểu diễn cây nhị phân
là chỉ ra ñỉnh con trái và ñỉnh con phải của mỗi ñỉnh.
Ta có thể sử dụng một mảng ñể lưu trữ các ñỉnh của
cây nhị phân.
Mỗi ñỉnh của cây ñược biểu gồm ba giá trị
Infor: Mô tả thông tin gắn với mỗi ñỉnh
Letf : Chỉ ñỉnh con trái
Right: Chỉ ñỉnh con phải.
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
14
Nếu cây nhị phân ñầy ñủ. Có thể lưu trữ cây này
bằng mãng 1 chiều
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
15
Nếu cây nhị phân không ñầy ñủ thì cách lưu trữ này
không thích hợp vì phí nhiều bộ nhớ.
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
16
Lưu trữ móc nối
Cách lưu trữ này khắc phục nhược ñiểm của cách lưu
trữ kế tiếp ñồng thời phản ánh ñược dạng tự nhiên của
cây. Cách lưu trữ này một phần tử có qui tắc sau:
Infor: Mô tả thông tin gắn với mỗi ñỉnh
Letf : Con trỏ trỏ tới cây con trái
Right: Con trỏ trỏ tới cây con phải
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
17
Khai báo cấu cây
typedef struct TNODE
{
Key;// là kiêu dư liêu cho key
struct NODE *pLeft, *pRight;
} *TREE;
typedef struct TNODE
{
int Key;
struct NODE *pLeft, *pRight;
} *TREE;
Ví vụ khai báo cây NP biểu diễn các nút là số nguyên
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
18
Duyệt cây nhị phân
Duyệt theo thứ tự trước (NLR)
Tại nút t ñang xét nếu khác rỗng
- Thăm gốc
- Duyệt câycon trái theo thứ trước
- Duyệt cây con phải theo thư tự trước
void NLR(TREE t)
{
if (t != NULL)
{
;
NLR(t->pleft);
NLR(t->pright);
}
}
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
19
Duyệt theo thứ tự giữa (LNR)
Tại nút t ñang xét nếu khác rỗng
- Duyệt cây con trái theo thứ giữa
- Thăm gốc
- Duyệt cây con phải theo thư tự giữa
void LNR(TREE t)
{
if (t != NULL)
{
NLR(t->pleft);
;
NLR(t->pright);
}
}
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
20
Duyệt theo thứ tự sau (LRN)
Tại nút t ñang xét nếu khác rỗng
- Duyệt cây con trái theo thứ sau
- Duyệt cây con phải theo thư tự sau
- Thăm gốc
void LRN(TREE t)
{
if (t != NULL)
{
NLR(t->pleft);
NLR(t->pright);
;
}
}
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
21
4.3. Cây Nhị Phân Tìm Kiếm
4.3.1. Cây nhị phân tìm kiếm
4.3.2. Các thao tác trên cây nhị phân tìm kiếm
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
22
4.3.1 Cây Nhị Phân Tìm Kiếm
Cây nhị phân tìm kiếm (CNPTK) là cây nhị phân thoả mãn
ñồng thời các ñiều kiện:
Khoá các ñỉnh thuộc cây con trái nhỏ hơn khoá nút gốc
Khoá nút gốc nhỏ hơn (hoặc bằng) khoá các ñỉnh thuộc
cây con phải
Cây con trái và cây con phải của gốc cũng là CNPTK
Cây NPTK ñược sử dụng vào nhiều
mục ñích khác nhau. Tuy nhiên việc
sử dụng cây NPTK ñể lưu giữ và
tìm kiếm thông tin vẫn là một trong
những ứng dụng quan trọng nhất
ðịnh Nghĩa
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
23
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 nấht của cây
Min
Max
Các Tính Chất
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
24
25
4.3.2 Các Thao Tác Trên Cây NPTK
Khai báo cấu trúc cây
Dựng cây – Thêm nút vào cây
Duyệt cây
Dựng cây từ kết quả duyệt cây
Tìm kiếm nút có giá trị x
Xóa nút có giá trị x trên cây
Hủy cây
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
Các lưu ý khi cài ñặt
- Bước 1: Khai báo kiểu dữ liệu biểu diễn cây
- Bước 2: Xây dựng hàm ñưa dữ liệu (nhập) vào cây
- Bước 3: Xây dựng các thao tác: Duyệt, Tìm, Hủy . . .
Các lưu ý khác
- Trước khi tạo nút phải xin cấp phát vùng nhớ
- Trước khi tạo cây phải khởi tạo cây rỗng
- Trước khi kết thúc chương trình phải hủy cây (Giải
phóng vùng nhớ)
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
26
27
Khai báo cấu cây
typedef struct TNODE
{
Key;// là kiêu dư liêu cho key
struct NODE *pLeft, *pRight;
} *TREE;
typedef struct TNODE
{
int Key;
struct NODE *pLeft, *pRight;
} *TREE;
Ví vụ khai báo cây NPTK biểu diễn các nút là số nguyên
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
Dựng cây – Thêm nút vào cây
Nếu nút cần thêm < nút ñang xét thì thêm về bên trái
Ngược lại thì thêm về bên phải
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
28
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
29
Duyệt Cây
7 3 1 6 4 36 15 23 40
Duyệt theo thứ tự trước (NLR)
Tại nút t ñang xét nếu khác rỗng
- In giá trị nút t
- Duyệt câycon trái theo thứ trước
- Duyệt cây con phải theo thư tự trước
void NLR(TREE t)
{
if (t != NULL)
{
coutkey<<“\t”;
NLR(t->pleft);
NLR(t->pright);
}
}
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
30
1 3 4 6 7 15 23 36 40
Duyệt theo thứ tự giữa (LNR)
Tại nút t ñang xét nếu khác rỗng
- Duyệt cây con trái theo thứ giữa
- In giá trị nút t
- Duyệt cây con phải theo thư tự giữa
void LNR(TREE t)
{
if (t != NULL)
{
NLR(t->pleft);
coutkey<<“\t”;
NLR(t->pright);
}
}
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
31
1 4 6 3 23 15 40 36 7
Duyệt theo thứ tự sau (LRN)
Tại nút t ñang xét nếu khác rỗng
- Duyệt cây con trái theo thứ sau
- Duyệt cây con phải theo thư tự sau
- In giá trị nút t
void LRN(TREE t)
{
if (t != NULL)
{
NLR(t->pleft);
NLR(t->pright);
coutkey<<“\t”;
}
}
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
32
Chương trình chính gọi các thủ tục dựng và duyêt cây
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
33
Dựng cây từ kết quả duyệt cây
7 3 1 6 4 36 15 23 40
Dựng cây từ kết quả Duyệt theo thứ tự trước (NLR)
- Chọn giá trị ñầu tiên làm nút gốc
- Lần lượt ñưa các giá trị còn lại từ trái sang phải vào
cây theo nguyên tắc dựng cây
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
34
1 4 6 3 23 15 40 36 7
Dựng cây từ kết quả duyệt theo thứ tự sau (LRN)
- Chọn giá trị cuối cùng làm nút gốc
- Lần lượt ñưa các giá trị còn lại từ phải sang trái vào
cây theo nguyên tắc dựng cây
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
35
Tìm kiếm
Ví dụ: Tìm nút có giá trị x=23
Tìm nút có giá trị x
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
36
Tìm nút có giá trị nhỏ nhất
Tương tự cho nút có giá trị lớn nhất, Nút nhỏ nhất của
cây con trái, nút lớn nhất của cây con phải
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
37
Xóa nút trên cây
Xóa nút có khóa là :1
Xóa tiếp nút có khóa là :23
Xóa nút lá.
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
38
Xóa nút có khóa là :6
Xóa tiếp nút có khóa là :15
7
3 36
4015
23
6
4
1
7
3 36
4015
23
41
7
3 36
402341
Xóa nút có 1 cây con
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
39
73 36
4015
23
6
4
1
Tìm nút thế mạng
Cách 1: Tìm nút trái nhất của cây con phải
Cách 2: Tìm nút phải nhất của cây con trái
Xóa nút có 2 cây con.
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
40
Cách 1: Tìm nút trái nhất của cây con phải
Xóa nút 3 (Dùng nút 4 trhay thế)
7
3 36
4015
23
5
4
1
6
7
4 36
4015
23
51
6
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
41
Cách 2: Tìm nút trái phải của cây con trái
Xóa nút 36 (Dùng nút 23 thay thế)
7
3 36
4015
23
5
4
1
6
7
3 23
40155
4
1
6
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
42
Thủ tục tìm nút thế mạng (phải nhất trên cây con trái)
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
43
Thủ tục xóa nút có giá X trên cây NPTK
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
44
Hủy toàn bộ cây
Việc hủy toàn bộ cây thực hiện thông qua thao tác
duyệt cây theo thứ tự sau
Nếu nút t khác rỗng
- Hủy cây con trái
- Hủy cây con phải
- Hủy nút t
void removeTree(TREE &t)
{
if(t)
{
removeTree(t->pLeft);
removeTree(t->pRight);
delete(t);
}
}
Khoa KTCN Trường ðH KTKT B.Dương© Dương Thành Phết-www.thayphet.net
45