Tải bản đầy đủ (.pdf) (43 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (443.19 KB, 43 trang )

Chương 6

Cây nhị phân và cây BST
(Buổi 10, 11)


Nội dung

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
2


Định nghĩa cây
™

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 đó:
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).
f

™



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

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
3


Định nghĩa cây
*
+

-

/

a

b

d

e


c

Cây biểu diễn biểu thức (a + b / c) * (d – e) ở dạng trung tố
Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
4


Định nghĩa cây
Mức 1

A
B

Mức 2

Mức 3

E

D

Mức 4


C

F

G

I

J

H

Cây nhiều nhánh
Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
5


Các thuật ngữ
™

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

f

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

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.

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
6


Các thuật ngữ
™

Nút lá (leaf) và nút trung gian (interior node)

f

Nút lá hoặc nút kết thúc là nút có bậc bằng 0
(không có cây con).
y

f

Ví dụ: Các nút D, F, G, H, I, J là các nút lá.

Nút trung gian là nút có bậc khác 0 và không là
nút gốc.
y

Ví dụ: Các nút B, E, C là các nút trung gian. Nút A là
nút gốc.

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
7


Các thuật ngữ
™


Mức (level) của nút và chiều cao (height) của
cây
f

Mức của nút gốc là 1. Mức của nút khác gốc bằng
mức của nút gốc của cây con nhỏ nhất chứa nút
này cộng 1.
y

f

Ví dụ: Mức của nút A là 1. Mức của các nút D, E, I, J là
3.

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.

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
8



Các thuật ngữ
™

Nút trước và nút sau
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.

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

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

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
9


Các thuật ngữ
f

Hai nút được gọi là anh em nếu chúng có cùng
nút cha.
y

™

Ví dụ: Nút D và E là hai nút anh em vì có cùng nút cha
là B.

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.

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015


Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
10


Cấu trúc dữ liệu
™

Node: mỗi nút có ba phần
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.
f

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
11


Cấu trúc dữ liệu
#include <iostream>
using namespace std;

struct Node;
typedef Node* ref;
struct Node
{
int Info;
ref Left;
ref Right;
};
int main()
{
ref root;
...
return 0;
}
Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
12


Cấu trúc dữ liệu
// Kiểm tra cây root rỗng
bool IsEmpty(ref root)
{
bool kq = root == NULL;

return kq;
}

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
13


Duyệt cây
™

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

N
L

R

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

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
14


Duyệt cây
™

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

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

f

Thứ tự tiền tố (pre-order): NLR, NRL.
Thứ tự trung tố (in-order): LNR, RNL.
Thứ tự hậu tố (post-order): LRN, RLN.

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

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

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
15


Duyệt cây - NLR
15

7

3

20

10

17

25

Duyệt NLR: 15 7 3 10 20 17 25
Trường Đại học Bách Khoa Tp.HCM

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

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
16


Duyệt cây - NLR
// 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);
}
}

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật

Chương 6. Cây và cây BST
17


Duyệt cây - NLR
void TraversalNLR(ref p, int n)
{
for (int i = 1; i <= n; i++)
cout << " ";
if (p != NULL)
{
cout << p->Info << endl;
TraversalNLR(p->Left, n+2);
TraversalNLR(p->Right, n+2);
}
else
cout << "0" << endl;
}

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
18



Duyệt cây - LNR
15

7

3

20

10

17

25

Duyệt LNR: 3 7 10 15 17 20 25
Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
19


Duyệt cây - LNR
// 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);
}
}

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
20


Duyệt cây - LNR
void TraversalLNR(ref p, int n)
{
if (p != NULL)
{
TraversalLNR(p->Left, n+2);
for (int i = 1; i <= n; i++)
cout << " ";
cout << p->Info << endl;

TraversalLNR(p->Right, n+2);
}
else
{
for (int i = 1; i <= n; i++)
cout << " ";
cout << "0" << endl;
}
}
Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
21


Duyệt cây - LRN
15

7

3

20

10


17

25

Duyệt LRN: 3 10 7 17 25 20 15
Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
22


Duyệt cây - LRN
// 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);
}
}


Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
23


Duyệt cây - LRN
void TraversalLRN(ref p, int n)
{
if (p != NULL)
{
TraversalLRN(p->Left, n+2);
TraversalLRN(p->Right, n+2);
for (int i = 1; i <= n; i++)
cout << " ";
cout << p->Info << endl;
}
else
{
for (int i = 1; i <= n; i++)
cout << " ";
cout << "0" << endl;
}
}
Trường Đại học Bách Khoa Tp.HCM

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

Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
24


Tạo cây - NLR
// Tạo cây từ mảng a theo thứ tự duyệt NLR
ref CreateTree(int a[])
{
int i = 0;
ref root = CreateTreeNLR(a, i);
return root;
}
int main()
{
int n = 11;
int a[] = {1, 2, 3, 0, 0, 4, 0, 0, 5, 0, 0};
ref root = CreateTree(a);
return 0;
}

Trường Đại học Bách Khoa Tp.HCM
Khoa Khoa học và Kỹ thuật Máy tính
© 2015


Nguyễn Trung Trực

Cấu trúc dữ liệu và Giải thuật
Chương 6. Cây và cây BST
25


×