1. Trang chủ
  2. » Giáo Dục - Đào Tạo

cấu trúc dữ liệu chương 6 Chuong_6_Cay va Cay BST

43 95 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 43
Dung lượng 443,19 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

tài liệu uy tín được biên soạn bởi giảng viên đại học Bách Khoa TPHCM, thuận lợi cho qua trình tự học, nghiên cứu bộ tự động hóa, điện tử, cơ điện tử, cơ khí chế tạo máy, lập trình nhúng, Tài liệu được kiểm duyệt bởi giảng viên, phòng đào tạo trường đại học bách khoa, lưu hành nội bộ

Trang 1

Chương 6

Cây nhị phân và cây BST

(Buổi 10, 11)

Trang 2

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 3

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

™ Cây (tree) là một tập hợp T rỗng hoặc bao gồm

nhiều phần tử, mỗi phần tử được gọi là nút

(node), trong đó:

f Một nút được gọi là nút gốc (root).

f Các nút còn lại được chia thành m nhóm, mỗi

nhóm là một cây và được gọi là cây con (subtree).

™ Cây rỗng (null tree) là một cây không có nút

nào.

Định nghĩa cây

Trang 4

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 5

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Mức 3

Mức 4

Trang 6

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

™ Bậc (degree) của nút và bậc của cây

f Bậc của nút là số cây con của nút này Một nút

không có cây con thì có bậc là 0.

y Ví dụ: Các nút A, B có bậc là 2.

f Bậc của cây là bậc lớn nhất của các nút của cây

này. Cây nhị phân (binary tree) là cây bậc 2.

y Ví dụ: Cây trong Hình 5.2 có bậc là 3.

Các thuật ngữ

Trang 7

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 8

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

f Chiều cao của cây là mức lớn nhất của các nút lá.

y Ví dụ: Cây trong Hình 5.2 có chiều cao là 4.

Các thuật ngữ

Trang 9

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

f Nút y là nút trước của nút x nếu cây con gốc y có

chứa nút x; khi đó, nút x được gọi là nút sau của

nút y.

y Ví dụ: Nút B là nút trước của nút G, nút G là nút sau

của nút B.

™ Nút cha (parent), nút con (child) và nút anh em

f Nếu nút y là nút trước của nút x và mức của nút x

bằng mức của nút y cộng 1 thì nút y được gọi là

nút cha của nút x và nút x được gọi là nút con của

nút y.

y Ví dụ: Nút B là nút cha của nút E và nút E là nút con

của nút B.

Các thuật ngữ

Trang 10

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

™ Cây có thứ tự (ordered tree) là một cây nếu ta

hoán vị các cây con của nó thì ta sẽ có một cây mới.

Các thuật ngữ

Trang 11

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

f Info : chứa thông tin của nút.

f Left : chứa tham chiếu đến nút con bên trái.

f Right : chứa tham chiếu đến nút con bên phải.

Trang 12

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 13

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Kiểm tra cây root rỗng

bool IsEmpty(ref root)

Trang 14

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

™ Duyệt cây là quá trình đi qua tất cả các nút của

cây mà mỗi nút chỉ được xử lý một lần.

f N là nút gốc của cây con.

f L là cây con bên trái.

f R là cây con bên phải

N

Biểu diễn cây nhị phân

Trang 15

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

™ Các loại duyệt cây:

f Duyệt cây theo chiều sâu (DFS – Depth-First

Search).

y Thứ tự tiền tố (pre-order): N LR, N RL.

y Thứ tự trung tố (in-order): L N R, R N L.

y Thứ tự hậu tố (post-order): LR N , RL N

f Duyệt cây theo chiều rộng (BFS – Breadth-First

Search): duyệt cây theo mức.

Trang 16

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 17

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Duyệt cây root theo thứ tự NLR

void NLR(ref root)

{

if (IsEmpty(root))

cout << "Cay rong" << endl;

else {

cout << "Cay nhi phan:" << endl;

TraversalNLR(root, 1);

} }

Trang 18

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

cout << p->Info << endl;

TraversalNLR(p->Left, n+2);

TraversalNLR(p->Right, n+2);

} else

cout << "0" << endl;

}

Trang 19

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 20

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Duyệt cây root theo thứ tự LNR

void LNR(ref root)

{

if (IsEmpty(root))

cout << "Cay rong" << endl;

else {

cout << "Cay nhi phan:" << endl;

TraversalLNR(root, 1);

} }

Trang 21

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

for (int i = 1; i <= n; i++)

cout << " ";

cout << "0" << endl;

} }

Trang 22

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 23

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Duyệt cây root theo thứ tự LRN

void LRN(ref root)

{

if (IsEmpty(root))

cout << "Cay rong" << endl;

else {

cout << "Cay nhi phan:" << endl;

TraversalLRN(root, 1);

} }

Trang 24

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

for (int i = 1; i <= n; i++)

cout << " ";

cout << "0" << endl;

} }

Trang 25

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Tạo cây từ mảng a theo thứ tự duyệt NLR

ref CreateTree(int a[])

Trang 26

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Tạo cây từ mảng a[]

ref CreateTreeNLR(int a[], int& i)

}

Trang 27

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 28

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Chiều cao của cây

// Chiều cao của cây p

int hl = Height(p->Left); int hr = Height(p->Right);

Trang 29

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Số nút lá của cây root

int Leaves(ref root)

Trang 30

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 31

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Số nút trung gian của cây

// Số nút trung gian của cây root

int Interiors(ref root)

Trang 32

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Số nút trung gian của cây

// Số nút trung gian của cây p

Trang 33

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

™ Cây nhị phân tìm kiếm (BST – Binary Search

Tree) là một cây nhị phân mà tại mỗi nút p của cây thì:

f Khóa của nút p lớn hơn các khóa của các nút của

cây con bên trái

f khóa của nút p nhỏ hơn các khóa của các nút của

cây con bên phải

K p – khóa của nút p

K L – khóa của một nút bất kỳ của cây con bên trái

K R – khóa của một nút bất kỳ của cây con bên phải

K L < K p < K R

Trang 34

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 35

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 36

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

f Key : chứa khóa (và thông tin) của nút.

f Count : số lần xuất hiện khóa của nút.

f Left : chứa tham chiếu đến nút con bên trái.

f Right : chứa tham chiếu đến nút con bên phải.

Trang 37

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

Trang 38

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

™ Kiểm tra cây BST rỗng

™ Thêm một nút mới vào cây BST.

™ Tìm kiếm một nút của cây BST.

™ Loại bỏ một nút của cây BST.

Trang 39

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Kiểm tra cây root rỗng

bool IsEmpty(ref root)

{

bool kq = root == NULL;

return kq;

}

Trang 40

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Thêm khóa x vào cây p

void InsertTree(ref& p, int x)

{

if (p == NULL) {

p = new Node; // Tạo nút mới p p->Key = x;

p->Count = 1;

p->Left = NULL;

p->Right = NULL;

} else

Trang 41

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Tìm kiếm khóa x trong cây p

// Trả về địa chỉ của nút tìm thấy.

ref Find(ref p, int x)

Trang 42

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

// Tìm và loại bỏ khóa x trong cây p

void Remove(ref& p, int x)

{

if (p != NULL) {

p = p->Left; // p chỉ có cây con bên trái else if ((p->Left == NULL) && (p->Right != NULL))

p = p->Right; // p chỉ có cây con bên phải

Trang 43

Trường Đại học Bách Khoa Tp.HCM

Khoa Khoa học và Kỹ thuật Máy tính

else // p có hai cây con

Del(p->Left, q); // Nút cực phải của cây con bên trái delete q;

} }

}

// Tìm nút cực phải của cây con bên trái của r

void Del(ref& r, ref& q)

Ngày đăng: 03/02/2018, 08:23

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm