Đặ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 5... CÁC LƯU Ý
Trang 1CÂY NHỊ PHÂN TÌM KIẾM
TMT
1
Trang 25. Định nghĩa kiểu dữ liệu
6. Các lưu ý khi cài đặt
7. Các thao tác
2
Trang 3CÁC KHÁI NIệM
Bậc của một nút: là số cây con của nút đó
Nút gốc: là nút không có nút cha
1 1
Trang 5Đặ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
5
Trang 6ĐịNH NGHĨA KIểU Dữ LIệU
typedef struct TNODE {
Trang 7VÍ Dụ KHAI BÁO CÂY NHị PHÂN
BIểU DIễN CÁC NODE LÀ Số
Trang 8CÁ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ỷ, …
Các lưu ý khác:
1 Trước khi tạo node mới phải xin cấp phát vùng nhớ
2 Trước khi tạo cây mới phải khởi tạo cây rỗng
3 Trước khi kết thúc chương trình phải huỷ cây (giải phóng vùng nhớ)
8
Trang 9CấU TRÚC CHƯƠNG TRÌNH
Khai báo cấu trúc cây
Khởi tạo cây rỗng
Xây dựng cây
Các thao tác
Hủy cây
9
Trang 13if(x<t->Key) ThemNut(t->pLeft, x);
}}
Trang 1717
Trang 18cout<<t->Key<<“\t”;NLR(t->pLeft);
NLR(t->pRight);
}}
18
Trang 19 Hãy xây dựng cây nhị phân tìm kiếm theo thứ tự nhập sau:
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
19
Trang 2020
Trang 21LNR(t->pLeft);
cout<<t->Key<<“ “;LNR(t->pRight);
}}
21
Trang 2222
Trang 23LRN(t->pLeft);
LRN(t->pRight);
cout<<t->Key<<“ “;
}}
23
Trang 25VấN Đề CầN QUAN TÂM
Xây 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 node 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 xây dựng cây.
Xây 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 node 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 xây dựng cây. 25
Trang 26VấN Đề CầN QUAN TÂM (TT)
Xây dựng cây từ kết quả duyệt theo thứ tự giữa (LNR)
Gọi r: Số lượng giá trị cho trước.
Gọi m = r div 2: Giá trị ở giữa
Chọn giá trị thứ m làm node gốc.
Lần lượt đưa các giá trị bắt đầu từ vị trí m-1 lùi về trái vào cây theo nguyên tắc xây dựng cây.
Lần lượt đưa các giá trị bắt đầu từ vị trí m+1 đến cuối vào cây theo nguyên tắc xây dựng
Trang 27BÀI TẬP
Bài 6
Hãy vẽ cây nhị phân tìm kiếm T biết rằng khi duyệt cây T theo thứ tự Left-Right-Node thì được dãy sau: 1, 4, 7, 5, 3, 16, 18, 15, 29,
25, 30, 20, 8.
Node-Left-Right.
Cây T có chiều cao là bao nhiêu? Tìm các
Trang 28BÀI TẬP
Bài 7
Hãy vẽ cây nhị phân tìm kiếm T biết rằng khi duyệt cây T theo thứ tự Node-Left-Right thì được dãy sau: 9, 4, 1, 3, 8, 6, 5, 7, 10, 14,
Trang 33CHO BIếT CÁC THÔNG TIN CủA CÂY
1. Số node lá (node bậc 0)
2. Số node có 1 cây con (node bậc 1)
3. Số node chỉ có 1 cây con phải
4. Số node có 1 cây con trái
5. Số node 2 cây con (node bậc 2)
6. Độ cao của cây
7. Số node của cây
8. Các node trên từng mức của cây
9. Độ dài đường đi từ gốc đến node x 33
Trang 34Số NODE LÁ
Nếu node t khác rỗng thì
Nếu node t có bậc 0 thì
Trả về 1 Ngược lại
Trả về Số node lá cây trái t
+ Số node lá cây phải t
Nếu node t rỗng thì
Trả về 0
34
Trang 36Số NODE CÓ 1 CÂY CON
Nếu node t khác rỗng thì
d=Số node bậc 1 của cây trái t
+ Số node bậc 1 của cây phải t
Trang 37Số NODE CÓ 1 CÂY CON
Trang 38Số NODE CHỉ CÓ 1 CÂY CON PHảI
Nếu node t khác rỗng thì
d = Số node chỉ có 1 cây con phải của cây con trái t
+ Số node chỉ có 1 cây con phải của cây con phải t
Nếu node t chỉ có 1 cây con phải thì trả về d+1
Ngược lại trả về d
Nếu node t rỗng thì
Trả về 0
38
Trang 39Số NODE CÓ 1 CÂY CON PHảI
if(t->pLeft==NULL && t->pRight!=NULL)
Trang 40Số NODE CHỉ CÓ 1 CÂY CON TRÁI
40
Trang 41Số NODE CÓ 2 CÂY CON
41
Trang 42Độ CAO CủA CÂY
int DoCaoCay(TREE t) {
if(t) {
int t1=DoCaoCay(t->pLeft);
int t2=DoCaoCay(t->pRight);
return Max(t1, t2)+1;
} else
return 0;
Trang 43Số NODE CủA CÂY
43
Trang 4444
Trang 45CÁC NODE TRÊN TừNG MứC
void InMuck(TREE t, int k, int m=0)
{
if(t) { if(m==k) {
printf("%d\t", t->Key);
return;
} else { m++;
InMuck(t->pLeft, k,m);
InMuck(t->pRight, k, m);
} } }
45
Trang 46IN CÁC NODE CủA TấT Cả MứC
46
Trang 47Độ DÀI ĐƯờNG ĐI Từ GốC ĐếN
NODE X
47
Trang 5151
Trang 53TÌM MIN
TNODE* Min(TREE t) {
while(t->pLeft!=NULL) {
t=t->pLeft;
} return t;
}
53
Trang 54MIN CÂY CON BÊN PHảI
54
Trang 55TÌM MAX
55
Trang 56TÌM MAX CÂY CON BÊN TRÁI
56
Trang 59XÓA NODE TRÊN CÂY
1. Node lá
2. Node có 1 cây con
3. Node có 2 cây con
59
Trang 60XÓA NODE LÁ
Xóa 1 Xóa 23
60
Trang 61XÓA NODE 1 CÂY CON
Xóa 6 Xóa 15
61
Trang 62XÓA NODE 2 CÂY CON
Tìm node thế mạng Cách 1: Tìm node trái nhất
của cây con phải Cách 2: Tìm node phải
nhất của cây con trái
16
23
62
Trang 64XÓA MộT NODE CÓ GIÁ TRị X
void HuyNut (TREE & t, int x)
delete pHuy;
} }
}
Trang 65HUỷ TOÀN Bộ CÂY
Nếu node khác rỗng
Hủy cây bên trái t
Hủy cây bên phải t
Hủy node t
65
Trang 66Cho dãy số theo thứ tự nhập từ trái sang phải như sau: 20 15 35 30 11 13 17
36 47 16 38 28 14
Hãy vẽ cây nhị phân tìm kiếm cho dãy số trên.
Hãy 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 xoá các nút: 11 và 35
66