Tải bản đầy đủ (.doc) (10 trang)

Tiểu luận môn Cấu trúc dữ liệu Cây Tìm Kiếm Nhị Phân

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (130.91 KB, 10 trang )

Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân
Nhóm 3: Thành viên:
1. Nguyễn Văn Nhớ (Nhóm trưởng); MSSV: DST091291; Lớp: DH10ST
2. Huỳnh Thanh Hùng; MSSV: DST091291; Lớp: DH10ST
3. Nguyễn Thị Huyền Trang; MSSV: DST091291; Lớp: DH10ST
Đề Tài 4: Cây Tim Kiếm Nhị Phân
1. Tạo lập cây (chèn các nút vào cây)
2. Xác định tổng số nút trên cây
3. Xác định số nút lá trên cây
4. Xác định số nút trung gian trên cây
5. Xác định số nút trong từng mức
6. Xác định nút nhỏ nhất của cây
7. Xác định nút lớn nhất của cây
8. Xóa một nút khỏi cây
9. Duyệt cây theo kiểu NLR (tiền tự)
10. Duyệt cây theo kiểu LRN (hậu tự)
11. Duyệt cây theo kiểu LNR (trung tự)
12.Duyệt cây theo từng mức từ trái qua phải (nút gốc, các
nút ở mức 1, các nút ở mức 2,….,các nút lá)
13. Tìm kiếm trên cây
14. Xóa toàn bộ cây
Bảng phân công đồ án:
Nguyễn Văn Nhớ (A)
Duyệt cây theo kiểu NLR,LRN,LNR, từ trái qua phải, tiềm
kiếm một nút trên cây, xóa toàn bộ cây, viết báo cáo, tổng
hợp Code
Huỳnh Thanh Hùng (B)
Xác định nút nhỏ nhất cảu cây, xác định nút lớn nhất của
cây, xóa một nút khỏi cây
Nguyễn Thi Huyền Trang (C)
Tạo lập cây, xác định tông số nút trên cây, xác định số nút


lá trên cây, số nút trung gian, số nút trong từng mức
I- Các thuật toán và ý tưởng
1. Tạo lập cây nhị phân:
- B1: Nếu cây rỗng thì nút đầu tiên được xem là nút gốc
- B2: Nhập nút thứ 2 va nút thứ 3. nếu nút thứ 2 nhỏ hơn nút đầu thì nút thứ 2 là nút gốc của nhánh
trái, ngược lại nếu nút thứ 2 lớn hơn nút đầu tiên thì nút thứ 2 là nút gốc nhánh phải. nếu nút thứ 3
nhỏ hơn nút đầu thì nút thứ 3 là nút gốc của nhánh trái, ngược lại nếu nút thứ 3 lớn hơn nút đầu tiên
thì nút thứ 3 là nút gốc nhánh phải.
- B3: nút thứ 4, ,n sẽ so sánh với giá trị của các nút để chèn vào cây nhị phân.
1/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân
Code:
void chen(Node* tam,Tree* T)
{
if(tam->Data<(*T)->Data)
if((*T)->left)
chen(tam,&(*T)->left);
else
(*T)->left=tam;
else
if((*T)->right)
chen(tam,&(*T)->right);
else
(*T)->right=tam;
}
void chen_node(int a,Tree* T)
{
Node *tam;
tam=(Node*)malloc(sizeof(Node));
tam->Data=a;

tam->left=NULL;
tam->right=NULL;
if((*T)==NULL)
(*T)=tam;
else
chen(tam,T);
2. Xác định tổng số nút trên cây:
- B1: Nếu cây nhị phân khác rỗng thì tổng số nút trên cây =1 + tổng số nút ở cây trái + tổng số nút ở
cây phải
Code:
int dem = 0;
//===========ham xu ly================
int dem_phu(Tree T)
{
if (T != NULL)
{
dem++;
if (T->left != NULL)
dem_phu(T->left);
if (T->right != NULL)
dem_phu(T->right);
}
return dem;
}
//=========ham the hien===========
void tong_so_nut(Tree T)
{
dem = 0;
if (T)
{

dem_phu(T);
2/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân
printf ("\nSo nut tren cay : %d",dem);
dem = 0;
}
else
printf ("\nCay rong!");
}
3. Đếm tổng số nút lá của cây:
- B1: Xác định cây nhị phân khác rỗng
- B2: Nếu một nút nào không có nút con (không có cây con bên nhánh trái, không có cây con bên
nhánh phải) thì được xem là nút lá.
Code:
int dem_la = 0;
//==========ham xu ly=================
void dem_nut_la_phu(Tree T)
{
if ((T->left == NULL) && (T->right == NULL))
dem_la++;
else
{
if (T->left != NULL)
dem_nut_la_phu (T->left);
if (T->right != NULL)
dem_nut_la_phu (T->right);
}
}
//============ham the hien=============
void tong_so_nut_la (Tree T)

{
dem_la = 0;
if (T)
{
dem_nut_la_phu(T);
printf ("\nSo nut la tren cay : %d ",dem_la);
dem_la = 0;
}
else
printf ("\nCay rong!");
}
4. Đếm tổng số nút trung giang:
- B1: Xác định cây nhị phân khác rỗng:
- B2: Nếu nút bất kỳ hoặc có nhánh trái hoặc có nhánh phải thì được xem là nút trung gian.
Code:
int dem_trung_gian = 0 ;
//========ham xu ly=====================
void dem_nut_trung_gian_phu(Tree T)
{
if (T)
{
3/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân
if (T->left != NULL || T->right != NULL)
dem_trung_gian++ ;
if (T->left != NULL)
dem_nut_trung_gian_phu(T->left);
if (T->right != NULL)
dem_nut_trung_gian_phu(T->right);
}

}
//=========ham the hien==============
void tong_so_nut_trung_gian(Tree T)
{
dem_trung_gian = 0;
if (T)
{
dem_nut_trung_gian_phu(T);
printf ("\nSo nut trung gian tren cay : %d ",dem_trung_gian);
dem_trung_gian = 0 ;
}
else
printf ("\nCay rong!");
}
5. Đếm số nút trên từng mức:
- B1: Xác định cây nhị phân khác rỗng
- B2: Đếm số nút trên từng mức
int a[10]; int muc=-1;
//===========ham xu ly===================
void dem_nut_theo_muc_phu (Tree T)
{
if (T != NULL)
{
muc++;
a[muc]++;
}
if (T->left != NULL)
dem_nut_theo_muc_phu (T->left);
if (T->right != NULL)
dem_nut_theo_muc_phu (T->right);

muc ;
}
//===========ham the hien================
void tong_so_nut_theo_muc (Tree T)
{
if (T)
{
muc = -1;
printf ("\nSo nut tren tung muc : ");
dem_nut_theo_muc_phu (T);
for (int i=0 ; i<10 ; i++)
if (a[i] != 0)
printf ("\n\tMuc %d : %d",i,a[i]);
for (i=0 ; i<10 ; i++)
4/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân
a[i] = 0;
muc = -1;
}
else
printf ("\nCay rong!\n");
}
6. Xác định nút nhỏ nhất của cây:
- B1: Nút nhỏ nhất chính là nút nằm bên trái nhất của cây
- B2: Cho T->left đến khi T->left =NULL thì T chính là giá trị nhỏ nhất của cây.
Code:
Node* min_nhanh_phai_phu (Tree T)// tree o day la T->right
{
if (T)
if (T->left == NULL)

return (T);
else
return (min_nhanh_phai_phu (T->left));
return NULL;
}
//==========ham the hien=========
void min_nhanh_phai (Tree T)
{
if (T)
if (T->right == NULL)
{
printf ("\nCay khong co nhanh phai!\n");
return;
}
else
{
printf ("\nNut nho nhat tren nhanh phai :
%d\n",min_nhanh_phai_phu(T->right)->Data);
}
else
printf ("\nCay rong!\n");
}
Code2:
Node* min_nhanh_trai_phu (Tree T)// tree o day la T->right
{
if (T)
if (T->right == NULL)
return (T);
else
return (min_nhanh_phai_phu (T->left));

return NULL;
}
//========ham the hien=============
void min_nhanh_trai (Tree T)
{
if (T)
5/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân
if (T->left == NULL)
{
printf ("\nCay khong co nhanh trai!\n");
return;
}
else
{
printf ("\nNut nho nhat tren Cay (nhanh trai) :
%d\n",min_nhanh_trai_phu(T->left)->Data);
}
else
printf ("\nCay rong!\n");
}
7. Xác định nút lớn nhất của cây:
- B1: Nút lớn nhất chính là nút nằm bên phải nhất của cây
- B2: Cho T->right đến khi T->right =NULL thì T chính là giá trị nhỏ nhất của cây.
Code:
Node* max_nhanh_trai_phu (Tree T)// tree o day la T->left
{
if (T)
if (T->right == NULL)
return (T);

else
return (max_nhanh_trai_phu (T->right));
return NULL;
}
//=========ham the hien===========
void max_nhanh_trai (Tree T)
{
if (T)
if (T->left == NULL)
{
printf ("\nCay khong co nhanh trai!\n");
return;
}
else
{
printf ("\nNut lon nhat tren nhanh trai :
%d\n",max_nhanh_trai_phu(T->left)->Data);
}
else
printf ("\nCay rong!\n");
}
Code2:
//=====Nut co gia tri lon nhat trong cay (nut lon nhat nhanh phai)======
//=======ham xu ly===========
Node* max_nhanh_phai_phu (Tree T)// tree o day la T->right
{
6/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân
if (T)
if (T->left == NULL)

return (T);
else
return (max_nhanh_phai_phu (T->right));
return NULL;
}
//========ham the hien===============
void max_nhanh_phai (Tree T)
{
if (T)
if (T->right == NULL)
{
printf ("\nCay khong co nhanh phai!\n");
return;
}
else
{
printf ("\nNut lon nhat Cay (tren nhanh phai) :
%d\n",max_nhanh_phai_phu(T->right)->Data);
}
else
printf ("\nCay rong!\n");
}
8. Xóa một nút khỏi cây:
VD: Ta có cây nhị phân như
hình vẽ bên: gồm có các nút.
-
Nếu xóa nút có giá trị (3) thì giá trị (2) sẽ
dời tới chỗ của giá trị (3).
7/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân

- Nếu xóa giá trị (7) thì giá trị (9) dời lên chỗ của giá trị (7).
- Nếu xóa gia trị (15) thì giá trị (13) dời lên chỗ giá trị (15).
9. Duyệt cây NLR (tiền tự):
VD: hình bên.
Duyệt NLR: 10 5 3 2 4 7 9 15 13 19 17 21
10. Duyệt cây LRN (hậu tự):
VD: hình bên.
Duyệt LRN: 2 4 3 9 7 5 13 17 21 19 15 10
11. Duyệt cây LNR (trung tự):
VD: hình bên.
Duyệt LNR: 2 3 4 5 7 9 10 13 15 17 19 21
12. Duyệt từng mức từ trái qua phải:
VD: hình bên.
Duyệt từ trái qua phải: 10 5 15 3 7 13 19 2 4 9 17 21
8/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân
13. Tìm kiếm một nút có giá trị x trên cây:
- Nếu giá trị x cần tìm bằng nút gốc thì tìm thấy ngay lúc đầu  giá trị x có trong cây T.
- Ngược lại, so sánh giá trị x với nút gốc, nếu x lớn hơn nút gốc thì tìm kiếm bên nhánh phải của
cây, ngược lại tìm kiếm bên nhánh trái của cây. Nếu tìm được thì báo là giá trị x có trong cây,
ngược lại x không có trên cây.
Code:
//==========ham xu ly============
Node* tim_nut (Tree T,int tam)
{
if (T)
{
if (T->Data == tam)
return T;
else if (T->Data < tam)

return (tim_nut (T->right,tam));
else
return (tim_nut (T->left,tam));
}
return NULL;
}
//===========ham the hien==================
void tim_kiem (Tree T)
{
if (T)
{
int x;
Node* tam;
printf ("\nNhap gia tri can tim : ");
scanf ("%d",&x);
tam=tim_nut (T,x);
if (tam)
printf ("\nTrong Cay co gia tri: %d",tam->Data);
else
printf ("\n Khong ton tai nut nay!\n");
}
else
printf ("\n Cay rong! ");
}
14. Xóa toàn bộ cây:
- Gán cho cây gia trị NULL. T->NULL;

Đánh giá Đồ Án:
9/10
Đồ Án_CTDL1_Nhóm 3_(Nhớ-Hùng-Trang_DH10ST)_Đề Tài 4: Cây Tìm Kiếm Nhị Phân

- Cơ bản đã hoàn thành hết các yêu cầu của đồ án
- Không có chức năng nào bỏ qua.
- Riêng phần khuyến khích đồ học chưa thực hiện được.
10/10

×