Bài giảng Cấu trúc dữ liệu - Chương 6: Kiểu cấu trúc cây cung cấp cho người học các kiến thức: Khái niệm cấu trúc cây - tree; đặc điểm cấu trúc cây; định nghĩa kiểu cấu trúc cây; các thao tác trên cấu trúc cây. Mời các bạn cùng tham khảo nội dung chi tiết.
Trang 1C HƯƠNG 6
K IỂU C ẤU T RÚC C ÂY
GV Th.S Thiều Quang Trung Trường Cao đẳng Kinh tế Đối ngoại
Trang 2• Khái niệm cấu trúc cây - tree
Trang 3Khái niệm cấu trúc cây
• Cây là một tập hợp T các phần tử (gọi là nút của cây), gồm có:
– một nút đặc biệt gọi là nút gốc,
– các nút còn lại được chia thành những tập rời
nhau T1, T2, …,Tn theo quan hệ phân cấp, trong đó
Ti cũng là một cây
• Mỗi nút ở cấp i sẽ quản lý một số nút ở cấp i+1 Quan hệ này gọi là quan hệ cha –con
Trang 4Khái niệm cấu trúc cây
1 1
Trang 5Mức 4 Mức 3 Mức 2 Mức 1
Khái niệm cấu trúc cây
• Chiều dài đường đi đến nút x: là số nhánh cần đi qua
kể từ gốc đến x
x
Trang 6Đặ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
GV Thiều Quang Trung
Trang 7Định nghĩa kiểu dữ liệu
typedef struct TNODE
Trang 9Cá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
kiếm, huỷ, …
Trang 11• Ngược lại thì thêm
về bên phải
Trang 13Duyệt cây
Trang 14GV Thiều Quang Trung
Trang 15Hàm duyệt 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) {
if(t!=NULL) {
cout<<t->Key<<“\t”; NLR(t->pLeft);
NLR(t->pRight);
} }
Trang 16Bài tập
Vẽ cây nhị phân tìm kiếm theo thứ tự nhập
từ trái sang phải và duyệt cây theo thứ tự
trước:
• 27; 19; 10; 21; 35; 25; 41; 12; 46; 7
• H; B; C; A; E; D; Z; M; P; T
• Huế; Đà Nẵng; Hà Nội; Vĩnh Long; Cần Thơ;
Sóc Trăng; Nha Trang; Đồng Nai; Vũng Tàu;
An Giang; Tiền Giang; Bình Dương; Hải
Dương
16
GV Thiều Quang Trung 16
Trang 17Bước Kết quả duyệt theo thứ tự LNR
Trang 18Hàm duyệt 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
18
void LNR (TREE t) {
if(t!=NULL) {
LNR(t->pLeft);
cout<<t->Key<<“ “; LNR(t->pRight);
} }
GV Thiều Quang Trung
Trang 19Bước Kết quả duyệt theo thứ tự LRN
Trang 20– Duyệt cây con bên
phải của t theo thứ tự
LRN
– In giá trị của t
20
void LRN (TREE t) {
if(t!=NULL) {
LRN(t->pLeft);
LRN(t->pRight);
cout<<t->Key<<“ “;
} }
GV Thiều Quang Trung 20
Trang 21Bài tập
• Bài 4 Vẽ cây nhị phân tìm kiếm theo thứ tự
nhập:
27, 19, 10, 21, 3, 15, 41, 50, 30, 7
Hãy duyệt cây trên theo thứ tự giữa
• Bài 5 Vẽ cây nhị phân tìm kiếm theo thứ tự
nhập:
H, B, C, A, E, D, T, M, X, O
Hãy duyệt cây trên theo thứ tự sau
Trang 22Vấn đề cần quan tâm
Tạo cây từ kết quả duyệt NLR
•Chọn giá trị đầu tiên làm node gốc
•Lần lượt đưa các giá trị còn lại từ trái sangphải vào cây theo nguyên tắc tạo cây
Tạo cây từ kết quả duyệt LRN
•Chọn giá trị cuối cùng làm node gốc
•Lần lượt đưa các giá trị còn lại từ phải sangtrái vào cây theo nguyên tắc tạo cây
22
GV Thiều Quang Trung 22
Trang 23Vấn đề cần quan tâm
Tạo cây từ kết quả duyệt LNR
• Gọi r: Số lượng giá trị cho trước
• Gọi m = r div 2: Giá trị ở giữa
Trang 24Bài tập
Bài 6 Vẽ cây nhị phân tìm kiếm T biết rằng
khi duyệt cây T theo thứ tự NLR thì được dãysau: 9, 4, 1, 3, 8, 6, 5, 7, 10, 14, 12, 13, 16, 19
• Hãy duyệt cây T trên theo thứ tự LRN
• Liệt kê các nút lá của cây Liệt kê các nútnhánh của cây
24
GV Thiều Quang Trung 24
Trang 25Bài 7 Vẽ cây nhị phân tìm kiếm T biết rằng
khi duyệt cây T theo thứ tự LRN thì đượcdãy sau: 1, 4, 7, 5, 3, 16, 18, 15, 29, 25, 30,
20, 8
• Hãy duyệt cây T trên theo thứ tự NLR
• Cây T có chiều cao là bao nhiêu? Tìm cácđường đi từ gốc có độ dài là 4 trên cây
Bài tập
Trang 26Hàm nhập dữ liệu vào cây
void Nhap(TREE &t)
Trang 27Hàm main gọi thao tác duyệt LNR
Trang 30Xóa node trên cây
1 Node lá
2 Node có 1 cây con
3 Node có 2 cây con
GV Thiều Quang Trung 30
Trang 31Xóa node lá
Xóa 1Xóa 23
7
23 4
Trang 32Xóa node 1 cây con
Xóa 6Xóa 15
4 23
GV Thiều Quang Trung 32
Trang 33Xóa node 2 cây con
16
23
Trang 34• Cho dãy số theo thứ tự nhập từ trái sang
phải: 20, 15, 35, 30, 11, 13, 17, 36, 47, 16,
38, 28, 14
– Vẽ cây nhị phân tìm kiếm cho dãy số trên
– Cho biết kết quả duyệt cây trên theo thứ tự trước, giữa và sau
– Cho biết độ cao của cây, các nút lá, các nút có bậc 2
– Vẽ lại cây sau khi thêm nút: 25 và 91
– Trình bày từng bước và vẽ lại cây sau khi lần lượt
Trang 35Viết hàm
1 In ra các node có giá trị chẵn
2 In ra các node có giá trị lớn hơn x
3 Độ cao của cây
4 Số node của cây
5 Tìm min, max
6 Tìm node có giá trị x
Trang 36Viết hàm
7 Số node lá (node bậc 0)
8 Số node có 1 cây con (node bậc 1)
9 Số node chỉ có 1 cây con phải
10 Số node có 1 cây con trái
11 Số node 2 cây con (node bậc 2)
12 Các node trên từng mức của cây
13 Độ dài đường đi từ gốc đến node x
36
GV Thiều Quang Trung 36
Trang 38Viết các hàm C/C++ thao tác cây
• Tìm chiều cao của cây
• Duyệt cây theo thứ tự giảm dần RNL
• In cấu trúc cây
GV Thiều Quang Trung 38
Trang 39Thêm 1 nút x vào cây
int themnode(tree &t,int x)
{ if(t!=NULL)
{ if(t->key==x) return 0;
if(t->key>x) return themnode(t->pleft,x);
else return themnode(t->pright,x); }
Trang 41Xóa 1 nút x khỏi cây
void huynode(tree &t,int x)
} else cout << "\nKhong tim thay so can tim!";
Trang 42} else
{ cout << "Khong tim thay ";
return FALSE ; } }
GV Thiều Quang Trung 42
Trang 44Đếm chiều cao của cây
GV Thiều Quang Trung 44
Trang 46GV Thiều Quang Trung 46
Trang 47Duyệt cây theo thứ tự giảm dần
Trang 48for (i=1;i<=dichphai;i++) cout << " ";
cout << temp->key << endl;