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
Trang 1Nhó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.
Trang 2void 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);
Trang 3printf ("\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)
{
Trang 4if (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++)
Trang 5a[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)
Trang 6if (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
{
Trang 7if (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).
Trang 8- 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
Trang 913 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:
Trang 10- 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.