Cây nhị phân tìm kiếm (Binary Searching Tree)

Một phần của tài liệu Cấu trúc dữ liệu tree - Cây (Trang 26 - 36)

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êmthê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

Một phần của tài liệu Cấu trúc dữ liệu tree - Cây (Trang 26 - 36)