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]
(1)CÂY NHỊ PHÂN TÌM KIẾM
TMT
(2)NỘI DUNG
1 Các khái niệm Đặc điểm
3 Hình dạng
4 Các khái niệm
5 Định nghĩa kiểu liệu Các lưu ý cài đặt
7 Các thao tác
(3)CÁC KHÁI NIỆM
Bậc nút: số
của nút
Nút gốc: nút khơng có nút
cha
Nút lá: nút có bậc Nút nhánh: nút có bậc
khác gốc
(4)Mức Mức Mức Mức
CÁC KHÁI NIỆM (TT)
Độ dài đường từ gốc
đến nút x: số nhánh cần qua kể từ gốc đến x
Độ cao cây: Độ dài
đường từ gốc đến nút mức thấp
(5)ĐẶC ĐIỂM CÂY NHỊ PHÂN TÌM KIẾM
Là nhị phân
Giá trị node
lớn giá trị tất node bên trái nhỏ giá trị tất node bên phải
➔Nút có giá trị nhỏ nằm trái
➔Nút có giá trị lớn nằm phải
7
3 36
1 6 15 40
23 4
(6)Nút
ĐỊNH NGHĨA KIỂU DỮ LIỆU
typedef struct TNODE {
<Data> Key;
struct TNODE *pLeft, *pRight;
} *TREE;
Giá trị
Trỏ trái Trỏ phải
TNODE
Key
pLeft pRight
(7)VÍ DỤ KHAI BÁO CÂY NHỊ PHÂN BIỂU DIỄN CÁC NODE LÀ SỐ NGUYÊN
typedef struct TNODE {
int Key;
struct TNODE *pLeft, *pRight; } *TREE;
(8)CÁC LƯU Ý KHI CÀI ĐẶT
Bước 1: Khai báo kiễu liệu biểu diễn cây
Bước 2: Xây dựng hàm đưa liệu (nhập) vào cây
Bước 3: Xây dựng thao tác duyệt, tìm kiếm, huỷ, …
Các lưu ý khác:
1 Trước tạo node phải xin cấp phát vùng nhớ. 2 Trước tạo phải khởi tạo rỗng.
3 Trước kết thúc chương trình phải huỷ (giải phóng vùng nhớ)
(9)CẤU TRÚC CHƯƠNG TRÌNH
Khai báo cấu trúc cây
Khởi tạo rỗng
Xây dựng cây
Các thao tác
Hủy cây
(10)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thông tin Tìm kiếm
5 Xố node
(11)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thơng tin Tìm kiếm
5 Xoá node
(12)40 15136346
XÂY DỰNG CÂY
7 36 3 1 6 4 15 40
7 ◼ Nếu node cần
thêm < node đang xét thêm về
bên trái.
◼ Ngược lại thêm
về bên phải.
(13)XÂY DỰNG CÂY (TT)
int ThemNut (TREE & t, int x) {
if(t!=NULL)
{ if(x==t->Key) return 0;
else {
if(x<t->Key) ThemNut(t->pLeft, x); else ThemNut(t->pRight, x); }
}
else {
t=new TNODE;
if(t==NULL) return -1;
(14)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thông tin Tìm kiếm
5 Xố node
(15)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thơng tin Tìm kiếm
5 Xoá node
(16)DUYỆT CÂY
Thứ tự trước (NLR) Thứ tự (LNR) Thứ tự sau (LRN)
(17)NLR
7 L7 R7
7 3 L3 R3 36 L36 R36
7 L6 36 15 R15 40
7 4 36 15 23 40
7
3 36
1 6 15 40
23 4
(18)NLR
Tại node t xét, nếu khác rỗng thì
In giá trị t
Duyệt bên trái của t theo thứ tự NLR Duyệt bên phải
của t theo thứ tự NLR
(19)BÀI TẬP
Bài 1
Hãy xây dựng nhị phân tìm kiếm theo thứ tự nhập sau:
27 19 10 21 35 25 41 12 46
Hãy duyệt theo thứ tự trước
Bài 2
Hãy xây dựng nhị phân tìm kiếm theo thứ tự nhập sau:
H B C A E D Z M P T
Hãy duyệt theo thứ tự trước
Bài 3
Hãy xây dựng 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
(20)LNR
L7 7 R7
L3 R3 L36 36 R36
1 L6 15 R15 36 40 1 15 23 36 40
7
3 36
1 6 15 40
23 4
(21)LNR
Tại node t xét, khác rỗng thì
Duyệt bên trái của t theo thứ tự LNR In giá trị t
Duyệt bên phải
của t theo thứ tự LNR
(22)LRN
L7 R7 7
L3 R3 L36 R36 36 7
1 L6 6 3 R15 15 40 36 7
1 23 15 40 36 7 7
3 36
1 6 15 40
23 4
(23)LRN
Tại node t xét, khác rỗng thì
Duyệt bên trái của t theo thứ tự LRN Duyệt bên phải
của t theo thứ tự LRN In giá trị t
(24)BÀI TẬP
Bài 4
Hãy xây dựng nhị phân tìm kiếm theo thứ
tự nhập sau:
27 19 10 21 3 15 41 50 30 27
Hãy duyệt theo thứ tự giữa
Bài 5
Hãy xây dựng nhị phân tìm kiếm theo thứ
tự nhập sau:
H B C A E D T M X O
Hãy duyệt theo thứ tự sau
(25)VẤN ĐỀ CẦN QUAN TÂM
Xây dựng từ kết duyệt theo thứ tự trước (NLR)
Chọn giá trị làm node gốc.
Lần lượt đưa giá trị lại từ trái
sang phải vào theo nguyên tắc xây dựng cây.
Xây dựng từ kết duyệt theo thứ tự sau (LRN)
Chọn giá trị cuối làm node gốc.
Lần lượt đưa giá trị lại từ phải
sang trái vào theo nguyên tắc xây
(26)VẤN ĐỀ CẦN QUAN TÂM (TT)
Xây dựng từ kết 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 giá trị vị trí m-1
lùi trái vào theo nguyên tắc xây dựng cây.
Lần lượt đưa giá trị vị trí m+1
(27)BÀI TẬP
Bài 6
Hãy vẽ nhị phân tìm kiếm T biết rằng duyệt T theo thứ tự Left-Right-Node dãy sau: 1, 4, 7, 5, 3, 16, 18, 15, 29, 25, 30, 20, 8.
Hãy duyệt T theo thứ tự Node-Left-Right.
(28)BÀI TẬP
Bài 7
Hãy vẽ nhị phân tìm kiếm T biết rằng duyệt T theo thứ tự Node-Left-Right dãy sau: 9, 4, 1, 3, 8, 6, 5, 7, 10, 14, 12, 13, 16, 19.
Hãy duyệt T theo thứ tự Left-Right-Node.
Liệt kê nút Liệt kê nút
(29)CÀI ĐẶT
void Nhap(TREE &t) {
int x; do{
cout<<“Nhap gia tri: “; cin>>x;
int kq=ThemNut(t, x); if(kq==0||kq==-1)
break; }while (true);
}
(30)CÀI ĐẶT
void main() {
TREE t; t=NULL; Nhap(t);
cout<<“Duyet cay theo thu tu giua: “; LNR(t);
Huy(t); }
(31)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thơng tin Tìm kiếm
5 Xoá node
(32)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thông tin Tìm kiếm
5 Xố node
(33)CHO BIẾT CÁC THÔNG TIN CỦA CÂY
1 Số node (node bậc 0)
2 Số node có (node bậc 1)
3 Số node có phải Số node có trái
5 Số node (node bậc 2)
6 Độ cao cây
7 Số node cây
8 Các node mức cây
(34)SỐ NODE LÁ
Nếu node t khác rỗng thì
Nếu node t có bậc thì Trả 1
Ngược lại
Trả Số node trái t + Số node phải t
Nếu node t rỗng Trả 0
(35)SỐ NODE LÁ (TT)
int DemNutLa (TREE t) {
if(t) {
if(t->pLeft==NULL && t->pRight==NULL) return 1;
else
return DemNutLa(t->pLeft)+DemNutLa(t->pRight); }
else
return 0; }
(36)SỐ NODE CÓ 1 CÂY CON
Nếu node t khác rỗng
d=Số node bậc trái t + Số node bậc phải t Nếu node t có bậc trả d+1 Ngược lại trả d
Nếu node t rỗng Trả
(37)SỐ NODE CÓ 1 CÂY CON
(38)SỐ NODE CHỈ CÓ 1 CÂY CON PHẢI
Nếu node t khác rỗng
d = Số node có phải trái t + Số node có phải phải t Nếu node t có phải trả d+1
Ngược lại trả d
Nếu node t rỗng Trả
(39)SỐ NODE CÓ 1 CÂY CON PHẢI
int DemNut1ConPhai(TREE t) {
if(t) {
int d=DemNut1ConPhai(t->pLeft) +DemNut1ConPhai(t->pRight);
(40)SỐ NODE CHỈ CÓ 1 CÂY CON TRÁI
(41)SỐ NODE CÓ 2 CÂY CON
(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;
(43)SỐ NODE CỦA CÂY
(44)CÁC NODE TRÊN TỪNG MỨC
Mức 2: 15 40
7
3 36
1 6 15 40
23 4
(45)CÁ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); }
} }
(46)IN CÁC NODE CỦA TẤT CẢ MỨC
(47)ĐỘ DÀI ĐƯỜNG ĐI TỪ GỐC ĐẾN NODE X
(48)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thông tin Tìm kiếm
5 Xố node
(49)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thơng tin Tìm kiếm
5 Xố node
(50)TÌM KIẾM
1 Tìm x Tìm
3 Tìm bên phải Tìm max
5 Tìm max bên trái
(51)VÍ DỤ TÌM X = 23
7
3 36
1 6 15 40
23 4
(52)TÌM X
TNODE * TimKiem(TREE t,int x) {
if(t!=NULL) {
if(t->Key==x) return t; if(x<t->Key)
return TimKiem(t->pLeft,x); else
return TimKiem (t->pRight,x); }
return NULL; }
(53)TÌM MIN
TNODE* Min(TREE t) {
while(t->pLeft!=NULL) {
t=t->pLeft; }
return t; }
(54)MIN CÂY CON BÊN PHẢI
(55)TÌM MAX
(56)TÌM MAX CÂY CON BÊN TRÁI
(57)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thơng tin Tìm kiếm
5 Xoá node
(58)CÁC THAO TÁC
1 Xây dựng Duyệt
3 Cho biết thơng tin Tìm kiếm
5 Xoá node
(59)XÓA NODE TRÊN CÂY
1 Node
2 Node có Node có
7
3 36
1 6 15 40
23 4
(60)XÓA NODE LÁ
Xóa Xóa 23
7
3 36
1 6 15 40
23 4
(61)XÓA NODE 1 CÂY CON
Xóa Xóa 15
7
3 36
1 6 15 40
23 4
4 23
(62)XÓA NODE 2 CÂY CON
Tìm node mạng
Cách 1: Tìm node trái nhất phải Cách 2: Tìm node phải
nhất trái
Xóa 36 (Cách 2)
7
3 36
1 6 15 40
23 4
16
23
(63)TÌM NODE THẾ MẠNG
void TimTheMang (TREE &pHuy,TREE & q) {
if(q->pLeft)
TimTheMang(pHuy, q->pLeft); else
{
pHuy->Key=q->Key; pHuy=q;
q=q->pRight; }
}
(64)XÓA MỘT NODE CÓ GIÁ TRỊ X
void HuyNut (TREE & t, int x) {
if(t!=NULL)
{ if(x<t->Key) HuyNut(t->pLeft,x); else{
if(x>t->Key) HuyNut(t->pRight,x); else{
TNODE * pHuy=t;
if(t->pLeft==NULL) t=t->pRight; else
if(t->pRight==NULL) t=t->pLeft; else TimTheMang(pHuy,t->pRight); delete pHuy;
} }
}
(65)HUỶ TOÀN BỘ CÂY
Nếu node khác rỗng
Hủy bên trái t Hủy bên phải t Hủy node t
(66)Cho dãy số theo thứ tự nhập từ trái sang phải sau: 20 15 35 30 11 13 17 36 47 16 38 28 14
Hãy vẽ nhị phân tìm kiếm cho dãy
số trên.
Hãy cho biết kết duyệt
theo thứ tự trước, sau.
Cho biết độ cao cây, nút lá,
nút có bậc 2.
Vẽ lại sau thêm nút: 25 91 Trình bày bước vẽ lại sau
khi xoá nút: 11 35