Uploaded by Hong Phuc Pham

1712676 CayNhiPhan

advertisement
Họ tên: Phạm Hồng Phúc
MSSV: 1712676
Lớp: 17CTT5
CÂY NHỊ PHÂN TÌM KIẾM
Phân tích
1. Biên dịch
2. Nhập vào:
- -1
-1:
Nhap vao du lieu, -1 de ket thuc: -1
Nhap vao 1 gia tri de tim: -1
-1 khong co trong cay.
- 5 -1
-1
Nhap vao du lieu, -1 de ket thuc: 5
Nhap vao du lieu, -1 de ket thuc: -1
5Nhap vao 1 gia tri de tim: -1
-1 khong co trong cay.
- 7 10
-23
-25
-4
1
-1
Nhap vao du lieu, -1 de ket thuc: 7
Nhap vao du lieu, -1 de ket thuc: 10
Nhap vao du lieu, -1 de ket thuc: -23
Nhap vao du lieu, -1 de ket thuc: -25
Nhap vao du lieu, -1 de ket thuc: -4
Nhap vao du lieu, -1 de ket thuc: 1
Nhap vao du lieu, -1 de ket thuc: -1
7 -23 -25 -4 1 10Nhap vao 1 gia tri de tim: -23
-23 co xuat hien trong cay.
Chieu cao cua nut -23 la 3
7 -25 -4 1 10
- -23
7
10
-25
-4
1
-1
Nhap vao du lieu, -1 de ket thuc: -23
Nhap vao du lieu, -1 de ket thuc: 7
Nhap vao du lieu, -1 de ket thuc: 10
Nhap vao du lieu, -1 de ket thuc: -25
Nhap vao du lieu, -1 de ket thuc: -4
Nhap vao du lieu, -1 de ket thuc: 1
Nhap vao du lieu, -1 de ket thuc: -1
-23 -25 7 -4 1 10Nhap vao 1 gia tri de tim: -23
-23 co xuat hien trong cay.
Chieu cao cua nut -23 la 4
-25 7 -4 1 10
-23
-23
-
7 10
-23
-4
1
-25
-1
-23
Nhap vao du lieu, -1 de ket thuc: 7
Nhap vao du lieu, -1 de ket thuc: 10
Nhap vao du lieu, -1 de ket thuc: -23
Nhap vao du lieu, -1 de ket thuc: -4
Nhap vao du lieu, -1 de ket thuc: 1
Nhap vao du lieu, -1 de ket thuc: -25
Nhap vao du lieu, -1 de ket thuc: -1
7 -23 -25 -4 1 10Nhap vao 1 gia tri de tim: -23
-23 co xuat hien trong cay.
Chieu cao cua nut -23 la 3
7 -25 -4 1 10
- 1 2
3
4
5
-1
3
Nhap vao du lieu, -1 de ket thuc: 1
Nhap vao du lieu, -1 de ket thuc: 2
Nhap vao du lieu, -1 de ket thuc: 3
Nhap vao du lieu, -1 de ket thuc: 4
Nhap vao du lieu, -1 de ket thuc: 5
Nhap vao du lieu, -1 de ket thuc: -1
1 2 3 4 5Nhap vao 1 gia tri de tim: 3
3 co xuat hien trong cay.
Chieu cao cua nut 3 la 3
1 2 4 5
3. Thứ tự in ra:
- Phần tử đầu tiên xuất ra là phần tử đầu tiên nhập vào
- Tiếp đến là các phần tử nhỏ hơn phần tử đầu tiên
- Cuối cùng là các phần tử lớn hơn phần tử đầu tiên
Xét trên phần tử bất kì của dãy xuất rất cũng thỏa trên
4. Vẽ cây
- Lần nhập 1: cây ko có phần tử
- Lần nhập 2: cây có 1 phần tử là 5
- Lần nhập 3:
-
Lần nhập 4:
-
Lần nhập 5:
5. Có thay đổi. Vì hàm Init(pTree) để gán pTree mới tạo bằng NULL, để khi vào hàm Insert
để thêm phần tử đầu tiên, do khi mới khai báo pTree đang chứa giá trị rác.
6. Nếu thay đổi như vậy thì chương trình sẽ thêm luôn giá trị -1 vào cây. Vì hàm Insert
được gọi trước khi dừng vòng lặp, nên sẽ thêm -1 vào cây rồi mới break;
7. Nếu đổi thì sẽ in ra các giá trị của cây con trái trước, r mới đến cây con phải.
8. Trong hàm Search: dòng lệnh được thực hiện khi x=pRoot->Key
Trong hàm RemoveNode: Mục đích của phép gán là để giữ lại node cần xóa trong khi
kiểm tra số con của nó. Hàm SearchStandFor để tìm 1 phần tử thế mạng, gán giá trị của
phần tử này cho node cần xóa, và xóa node của phần tử thế mạng đó.
9. Kết quả thay đổi, vì hàm đang tìm phần tử phải nhất nên cần truyền vào pLeft, nếu
chuyển vào pRight mà muốn vẫn đúng thì cần đổi hàm thành tìm phần tử trái nhất.
10. Thì node cần xóa sẽ không bị hủy, cũng ko có con trỏ trỏ tới nó nữa.
Áp dụng – Nâng cao
1. Tính tổng
int SumTree(NODE* pTree)
{
if (pTree != NULL)
return pTree->Key + SumTree(pTree->pLeft) + SumTree(pTree->pRight);
return 0;
}
2. Giá trị lớn nhất, giá trị nhỏ nhất
int max(NODE* Tree)
{
if (Tree->pRight)
return max(Tree->pRight);
return Tree->Key;
}
int min(NODE* Tree)
{
if (Tree->pLeft)
return min(Tree->pLeft);
return Tree->Key;
}
3. Đếm số lượng nút
int CountNode(NODE* pTree)
{
if (pTree != NULL)
return 1 + CountNode(pTree->pLeft) + CountNode(pTree->pRight);
return 0;
}
4. Đếm số nút lá:
int DemLa(NODE* pTree)
{
if (pTree != NULL)
return ((pTree->pLeft == NULL) && (pTree->pRight == NULL)) +
DemLa(pTree->pLeft) + DemLa(pTree->pRight);
return 0;
}
5. Đếm và cho biết số lượng các giá trị phân biệt trong dãy cho trước
struct NODE{
int Key;
int dem;
NODE *pLeft;
NODE *pRight;
};
void Insert(NODE *&pRoot, int x)
{
if (pRoot == NULL)
{
NODE *q;
q = new NODE;
q->Key = x;
q->dem = 1;
q->pLeft = q->pRight = NULL;
pRoot = q;
}
else
{
if (x < pRoot->Key)
Insert(pRoot->pLeft, x);
else if (x > pRoot->Key)
Insert(pRoot->pRight, x);
else pRoot->dem++;
}
}
void NLR(NODE* pTree)
{
if (pTree != NULL)
{
printf("%d: %d\n", pTree->Key, pTree->dem);
NLR(pTree->pLeft);
NLR(pTree->pRight);
}
}
void Cau_5(int *a,int n, NODE *&pRoot)
{
for (int i = 0; i < n; i++)
{
Insert(pRoot, a[i]); //thêm từ mảng vào cây
}
NLR(pRoot);//in cây ra màn hình
}
Bài tập làm thêm
1. Thống kê
#include "stdio.h"
#include <string.h>
struct NODE{
char Key;
int dem;
NODE *pLeft;
NODE *pRight;
};
void Init(NODE *&TREE)
{
TREE = NULL;
}
void Insert(NODE *&pRoot, char x)
{
if (pRoot == NULL)
{
NODE *q;
q = new NODE;
q->Key = x;
q->dem = 1;
q->pLeft = q->pRight = NULL;
pRoot = q;
}
else
{
if (x < pRoot->Key)
Insert(pRoot->pLeft, x);
else if (x > pRoot->Key)
Insert(pRoot->pRight, x);
else pRoot->dem++;
}
}
void NLR(NODE* pTree)
{
if (pTree != NULL)
{
printf("%c: %d\n", pTree->Key, pTree->dem);
NLR(pTree->pLeft);
NLR(pTree->pRight);
}
}
NODE* Search(NODE* pRoot, char x)
{
if (pRoot == NULL)
return NULL;
if (x < pRoot->Key)
Search(pRoot->pLeft, x);
else
if (x > pRoot->Key)
Search(pRoot->pRight, x);
else
{
return pRoot;
}
}
void TaoCay(char *a, NODE *&pRoot)
{
int n = strlen(a);
for (int i = 0; i < n; i++)
{
Insert(pRoot, a[i]);
}
}
int CountNode(NODE* pTree)
{
if (pTree != NULL)
return pTree->dem + CountNode(pTree->pLeft) + CountNode(pTree->pRight);
return 0;
}
void main()
{
char *a = { "hoc sinh di hoc sinh hoc" };
NODE *TREE, *p;
char x;
Init(TREE);
TaoCay(a, TREE);
printf("co %d ki tu\n", CountNode(TREE));
NLR(TREE);
scanf("%c", &x);
p = Search(TREE, x);
if (p != NULL)
{
printf("xuat hien %d lan trong chuoi\n", p->dem);
}
else
printf("khong co trong cay\n");
}
2. Thống kê chuỗi
#include "stdio.h"
#include <string.h>
struct NODE{
char Key[7];
int dem;
NODE *pLeft;
NODE *pRight;
};
void Init(NODE *&TREE)
{
TREE = NULL;
}
void Insert(NODE *&pRoot, char *x)
{
if (pRoot == NULL)
{
NODE *q;
q = new NODE;
strcpy(q->Key, x);
q->dem = 1;
q->pLeft = NULL;
q->pRight = NULL;
pRoot = q;
}
else
{
if (strcmp(x, pRoot->Key)<0)
Insert(pRoot->pLeft, x);
else if (strcmp(x, pRoot->Key)>0)
Insert(pRoot->pRight, x);
else pRoot->dem++;
}
}
void NLR(NODE* pTree)
{
if (pTree != NULL)
{
printf("%s: %d\n", pTree->Key, pTree->dem);
NLR(pTree->pLeft);
NLR(pTree->pRight);
}
}
void TaoCay(char *a, NODE *&pRoot)
{
int n = strlen(a);
int j = 0;
char b[7];
for (int i = 0; i < n; i++)
{
if (a[i] != ' ')
{
b[j] = a[i];
j++;
}
else
{
b[j] = '\0';
Insert(pRoot, b);
j = 0;
strcpy(b, "");
}
}
}
void main()
{
char *a = { "hoc sinh di hoc mon sinh hoc" };
NODE *TREE;
Init(TREE);
TaoCay(a, TREE);
NLR(TREE);
}
Download