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[r]
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 concủa nút đó
Nút gốc: là nút không có nútcha
Nút lá: là nút có bậc bằng 0
Nút nhánh: là nút có bậckhác 0 và không phải là gốc
2
2 2
1 1
Trang 4 Độ cao của cây: Độ dàiđường đi từ gốc đến nút
lá ở mức thấp nhất
4
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ácnode 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
23 4
5
Trang 6typedef struct TNODE {
Trang 7V Í DỤ KHAI BÁO CÂY NHỊ PHÂN BIỂU
DIỄN CÁC NODE LÀ SỐ NGUYÊN
typedef struct TNODE
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);
else ThemNut(t->pRight, x);
}}
Trang 1717
Trang 18cout<<t->Key<<“\t”;NLR(t->pLeft);
NLR(t->pRight);
}}
18
Trang 19Tiề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)
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)
sang trái vào cây theo nguyên tắc xây
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 cây.26
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,
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,
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 35return 0;
}
35
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 Nếu node t có bậc 1 thì trả về d+1 Ngược lại trả về d
Nếu node t rỗng thì
Trả về 0
36
Trang 37SỐ NODE CÓ 1 CÂY CON
||(t->pLeft==NULL&&t->pRight!=NULL)) return d+1;
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
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
7
23 4
59
Trang 60XÓA NODE LÁ
Xóa 1Xóa 23
7
23 4
60
Trang 61XÓA NODE 1 CÂY CON
Xóa 6Xóa 15
7
23 4
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)
} }
}
Trang 65H UỶ 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