1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

10 1,2K 1

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 94,5 KB

Nội dung

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 1

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.

Trang 2

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);

Trang 3

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)

{

Trang 4

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++)

Trang 5

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)

Trang 6

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

{

Trang 7

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).

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 9

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:

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.

Ngày đăng: 18/03/2015, 20:25

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w