2. Cây nhị phân (Binary Tree)
2.3. Cây nhị phân tìm kiếm (Binary Searching Tree)
2.3.1. Khái niệm – Cấu trúc dữ liệu
Cây nhị phân tìm kiếm là cây nhị phân có thành phần khóa của
mọi nút lớn hơn tất cả thành phần khóa của tất cả các nút trong cây con trái của nó và nhỏ hơn thành phần khóa của tất cả các nút trong cây con phải của nó.
Cấu trúc dữ liệu của cây nhị phân tìm kiếm là cấu trúc dữ liệu
biểu diễn cây nhị phân nói chung. typedef struct BSTNode
{ T Key;
BSTNode * BSTLeft; BSTNode * BSTRight; } BSTOneNode;
typedef BSTOneNode * BSTType;
Để quản lý các cây nhị phân tìm kiếm chúng ta cần quản lý địa
2. Cây nhị phân (Binary Tree)
2.3. Cây nhị phân tìm kiếm (Binary Searching Tree)
2.3.1. Khái niệm – Cấu trúc dữ liệu (tt)
Khóa nhận diện của cây tìm kiếm đôi một khác nhau (không có
hiện tượng trùng khóa)
Nếu cần quản lý các nút có khóa trùng nhau trong cây nhị phân
tìm kiếm thì có thể mở rộng cấu trúc bằng cách thêm thành
phần Count ghi nhận số khóa trùng:
typedef struct BSENode
{ T Key;
int Count;
BSENode * BSELeft; BSENode * BSERight; } BSEOneNode;
typedef BSEOneNode * BSEType;
Nút bên trái nhất là nút có giá trị khóa nhận diện nhỏ nhất và
nút phải nhất là nút có giá trị khóa nhận diện lớn nhất.
28
2. Cây nhị phân (Binary Tree)
2.3. Cây nhị phân tìm kiếm (Binary Searching Tree)
2.3.2. Các thao tác trên cây nhị phân tìm kiếm 2.3.2.a. Tìm kiếm trên cây
2.3.2.b. Thêm vào một nút trên cây 2.3.2.c. Loại bỏ 1 nút trên cây
2. Cây nhị phân (Binary Tree)
2.3.2.a. Tìm kiếm trên cây nhị phân tìm kiếm BST
Tìm kiếm trong cây có tồn tại nút có khóa (Key) là SearchData
hay không.
Dùng thuật toán tìm kiếm nhị phân vì do đặc điểm của cây nhị
phân tìm kiếm thì tại 1 nút nểu Key của nút này khác với SearchData:
Nếu SearchData > Key của nút tìm ở cây con bên phải
Nếu SearchData < Key của nút tìm ở cây con bên trái
B1: CurrNode = BSTree
B2: IF (CurrNode == NULL or CurrNode->Key == SearchData) Thực hiện BKT
B3: IF (CurrNode ->Key > SearchData) // tìm ở cây con bên trái CurrNode = CurrNode->BSTree->BSTLeft
B4: ELSE // tìm ở cây con bên phải
CurrNode = CurrNode->BSTree->BSTRight B5: Lặp lại B2
30
2. Cây nhị phân (Binary Tree)
2.3.2.a. Tìm kiếm trên cây nhị phân tìm kiếm BST (tt) Cài đặt thuật toán
BSTType BSTSearching (BSTType BSTree, T SearchData)
{
BSTType CurrNode = BSTree;
while (CurrNode !=NULL & CurrNode->Key != SeachData) {
if (CurrNode ->Key > SearchData)
CurrNode = CurrNode ->BSTLeft; else
CurrNode = CurrNode ->BSTRight; }
return (CurrNode); }
2. Cây nhị phân (Binary Tree)
2.3.2.b. Thêm vào một nút trên cây nhị phân tìm kiếm
Giả sử thêm vào 1 nút có thành phần dữ liệu là NewData vào
cây nhị phân tìm kiếm sao cho sau khi thêm, cây vẫn là cây nhị phân tìm kiếm.
Bao gồm các thao tác tìm kiếm vị trí thêm và thêm nút vào cây.
Thao tác chỉ thêm được nếu không có hiện tượng trùng khóa,
do đó nếu NewData trùng với Key của 1 trong các nút trong
32
2. Cây nhị phân (Binary Tree)
2.3.2.b. Thêm vào một nút trên cây nhị phân tìm kiếm (tt) B1: NewNode = BinTreeCreateNode(NewData) B2: IF(NewNode == NULL) Thực hiện BKT B3: IF (BSTree == NULL) B3.1: BSTree = NewNode B3.2: Thực hiện BKT B4: CurrNode = BSTree B5: IF (CurrNode == NULL) Thực hiện BKT B6: IF (CurrNode->Key > NewData) B6.1: AddLeft = True B6.2: If (CurrNode->BSTLeft != NULL) CurrNode = CurrNode->BSTLeft B7: IF (CurrNode->Key < NewData) B6.1: AddLeft = False B6.2: If (CurrNode->BSTRight != NULL) CurrNode = CurrNode->BSTRight B8: Lặp lại B5 B9: IF (AddLeft == True) CurrNode = CurrNode->BSTLeft B10: ELSE CurrNode = CurrNode->BSTRight BKT: Kết thúc
2. Cây nhị phân (Binary Tree)
2.3.2.b. Thêm vào một nút trên cây nhị phân tìm kiếm (tt) BSTType BSTAddNode (BSTType &BSTree, T NewData) { BSTType NewNode = BinTreeCreateNode(NewData);
if (NewNode == NULL) return (NewNode); if (BSTree == NULL) BSTree = NewNode; else
{ BSTType CurrNode = BSTree; int AddLeft = 1;
while (CurrNode->Key != NewData) // khong them neu trung Key { if (CurrNode->Key > NewData) // them o cay con ben trai
{ AddLeft = 1;
if (CurrNode->BSTLeft != NULL)
CurrNode = CurrNode->BSTLeft; else break;
}
else // them o cay con ben phai { AddLeft = 0; if (CurrNode->BSTRight != NULL) CurrNode = CurrNode->BSTRight; else break; } }
if (AddLeft == 1) CurrNode->BSTLeft = NewNode; else CurrNode->BSTRight = NewNode; }
34
2. Cây nhị phân (Binary Tree)
2. Cây nhị phân (Binary Tree)
2.3.2.d. Hủy toàn bộ cây
Thao tác chỉ đơn giản là việc thực hiện nhiều lần thao tác hủy một nút trên cây nhị phân tìm kiếm cho đến khi cây trở thành rỗng. Hàm thực hiện việc hủy tất cả các nút trong cây nhị phân tìm kiếm
BSTree.
void BSTDelete(BSTType &BSTree) {
BSTType DelNode = BSTree;
while (BSTDeleteNodeTRS(BSTree, DelNode->Key) == 1) DelNode = BSTree;
return; }
36