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