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

Bài giảng môn Cấu trúc dữ liệu - Chương 5: Cây (tree)

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 (398.54 KB, 40 trang )

Chương 5:
CÂY (TREE)

189


190

NỘI DUNG CHƯƠNG 5
1.
2.

Khái niệm cây – Biểu diễn cây
Cây nhị phân (Binary Tree)
1.
2.
3.

3.

Định nghĩa
Biểu diễn và các thao tác
Cây nhị phân tìm kiếm (Binary Searching Tree)

Cây cân bằng (Balanced Tree)
1.
2.

Định nghĩa – Cấu trúc dữ liệu
Các thao tác trên cây cân bằng


BÀI TẬP


191

1.Khái niệm cây – Biểu diễn cây
1.1 Định nghĩa cây
1.2. Một số khái niệm liên quan
1.2.a. Bậc của 1 cây
1.2.b. Bậc của 1 nút
1.2.c. Nút gốc
1.2.d. Nút kết thúc
1.2.e. Nút trung gian
1.2.f. Mức của 1 nút
1.2.g. Chiều cao (chiều sâu) của 1 cây
1.2.h. Nút trước, nút sau của 1 nút
1.2.i. Nút cha, nút con của 1 nút
1.2.j. Chiều dài đường đi của 1 nút
1.2.k. Chiều dài đường đi của 1 cây
1.2.l. Rừng


1.Khái niệm cây – Biểu diễn cây
1.1 Định nghĩa cây

Cây là một tập hợp các phần tử (nút) được tổ chức và có các
đặc điểm






Hoặc là tập hợp rỗng (cây rỗng)
Hoặc là tập hợp khác rỗng trong đó có 1 nút duy nhất làm nút gốc
(Root’s Node), các nút còn lại được phân thành các nhóm trong đó mỗi
nhóm là 1 cây con (Sub-Tree)

Các cây con cũng có thể là tập rỗng hay khác rỗng trong đó
có 1 nút là gốc cây con.

192


193

1.Khái niệm cây – Biểu diễn cây
1.2. Một số khái niệm liên quan
1.2.a. Bậc của 1 nút
Bậc của 1 nút (node’s degree) là số cây con của nút đó

1.2.b. Bậc của 1 cây
Bậc của 1 cây (tree’s degree) là bậc lớn nhất của các

nút trong cây

Cây có bậc N gọi là cây N-phân
1.2.c. Nút gốc

Nút gốc (root’s tree) là nút không phải là nút gốc cây
con của bất kỳ 1 cây con nào khác trong cây (nút

không làm gốc cây con)


194

1.Khái niệm cây – Biểu diễn cây
1.2.d. Nút kết thúc
Nút kết thúc hay còn gọi nút lá (leaf’s node) là nút có bậc =
0 (nút khơng có nút cây con)
1.2.e. Nút trung gian

Nút trung gian hay cịn gọi nút giữa (interior’s node) là
nút không phải là nút gốc và cũng khơng phải nút kết
thúc (nút có bậc khác khơng và là nút gốc của cây con
nào đó trong cây)
1.2.f. Mức của 1 nút

Mức của 1 nút (node’s level) bằng mức của nút gốc
cây con chứa nó +1.

Mức của nút gốc = 1


195

1.Khái niệm cây – Biểu diễn cây
1.2. Một số khái niệm liên quan (tt)
1.2.g. Chiều cao (chiều sâu) của 1 cây

Chiều cao (chiều sâu) của 1 cây (tree’s height | tree’s

depth) là mức cao nhất của 1 nút trong cây
1.2.h. Nút trước, nút sau của 1 nút

Nút T được gọi là nút trước của 1 nút (ancestor’s node)
của nút S nếu cây con có gốc là T chứa cây con có gốc
là S. Khi đó S được gọi là nút sau của nút T
(descendant’s node)
1.2.e. Nút trung gian

Nút trung gian hay cịn gọi nút giữa (interior’s node) là
nút khơng phải là nút gốc và cũng không phải nút kết
thúc (nút có bậc khác khơng và là nút gốc của cây con
nào đó trong cây)


196

1.Khái niệm cây – Biểu diễn cây
1.2. Một số khái niệm liên quan (tt)
1.2.f. Mức của 1 nút

Mức của 1 nút (node’s level) bằng mức của nút gốc
cây con chứa nó +1.

Mức của nút gốc = 1
1.2.g. Chiều cao (chiều sâu) của 1 cây

Chiều cao (chiều sâu) của 1 cây (tree’s height | tree’s
depth) là mức cao nhất của 1 nút trong cây
1.2.h. Nút trước, nút sau của 1 nút

Nút T được gọi là nút trước của 1 nút (ancestor’s node)

của nút S nếu cây con có gốc là T chứa cây con có gốc
là S. Khi đó S được gọi là nút sau của nút T
(descendant’s node)


197

1.Khái niệm cây – Biểu diễn cây
1.2. Một số khái niệm liên quan (tt)
1.2.i. Nút cha, nút con của 1 nút

Nút B được gọi là nút cha (parent’s node) của nút C
nếu nút B là nút trước của nút B và mức của nút C lớn
hơn mức của B là 1 mức. Khi đó nút C được gọi là nút
con (child’s node) của B
1.2.j. Chiều dài đường đi của 1 nút

Chiều dài đường đi của 1 nút là số đỉnh (số nút) tính từ
nút gốc để đi đến nút đó.

Chiều dài đường đi của nút gốc luôn = 1, chiều dài
đường đi tới 1 nút bằng chiều dài đường đi tới nút cha
của nó + 1


198

1.Khái niệm cây – Biểu diễn cây

1.2. Một số khái niệm liên quan (tt)
1.2.k. Chiều dài đường đi của 1 cây

Chiều dài đường đi của 1 cây (path’s length of the tree)
là tổng tất cả các chiều dài đường đi của tất cả các nút
trên cây (chiều dài đường đi trong internal path’s
length).

Tính chiều dài đường đi ngồi (external path’s length)
bằng cách mở rộng tất cả các nút của cây sao cho các
nút của cây có cùng bậc (thêm vào các nút giả) với bậc
của cây. Chiều dài đường đi ngoài bằng tổng chiều
1.2.l. Rừng.
Rừng (forest) là tập hợp các cây.


Khi cây mất gốc  rừng


199

1.Khái niệm cây – Biểu diễn cây
1.3. Biểu diễn cây

Dùng đồ thị, Dùng giản đồ tập hợp, Sử dụng dạng phân
cấp chỉ số
BIỂU DIỄN CÂY TRONG BỘ NHỚ MÁY TÍNH

Để biểu diễn cây trong bộ nhớ máy tính dùng danh sách
liên kết.


Để biểu diễn cây N-phân dùng danh sách có N mối liên kết
để quản lý N địa chỉ nút con.

Cấu trúc dữ liệu của cây N-phân tương tự cấu trúc dữ liệu
đa liên kết.
const int N = 100;
typedef struct NTNode
{ T Key;
NTNode * SubNode[N];
}NTOneNode;
typedef struct NTOneNode * NTType;
Để quản lý cây, chỉ cần quản lý địa chỉ nút gốc NTType NTree;


2. Cây nhị phân (Binary Tree)
2.1. Định nghĩa

Cây nhị phân là cây có bậc bằng 2 (bậc của nút tối đa bằng
2)

200


201

2. Cây nhị phân (Binary Tree)
2.2. Biểu diễn và các thao tác

Để biểu diễn cây nhị phân trong bộ nhớ máy tính dùng

danh sách có 2 mối liên kết để quản lý địa chỉ 2 nút con
(cây con trái và cây con phải).

Như vậy cấu trúc dữ liệu của cây nhị phân tương tự
cấu trúc dữ liệu của danh sách liên kết đôi nhưng cách
thức liên kết khác:
typedef struct BinTNode
{ T Key;
BinTNode * BinTLeft;
BinTNode * BinTRight;
}BinTOneNode;
typedef BinTOneNode * BinTType;

Để quản lý cây nhị phân chỉ cần quản lý địa chỉ nút gốc
BinTType BinTree;


202

2. Cây nhị phân (Binary Tree)
2.2. Biểu diễn và các thao tác (tt)
Các thao tác trên cây nhị phân bao gồm:
a. Khởi tạo cây nhị phân
b. Tạo mới 1 nút
c. Thêm 1 nút vào cây nhị phân
d. Duyệt qua các nút trên cây nhị phân
e. Tính chiều cao của cây
f. Tính số nút của cây
g. Hủy 1 nút trên cây nhị phân



203

2. Cây nhị phân (Binary Tree)
2.2. a. Khởi tạo cây nhị phân
Khởi tạo cây nhịn phân: cho con trỏ quản lý địa chỉ nút gốc
về con trỏ NULL
BinTType BinTreeInitialize(BinTType & BTree)
{
BTree = NULL
return (BTree );
}


2. Cây nhị phân (Binary Tree)
2.2. b. Tạo mới 1 nút
Thuật toán
B1: BTNode = new BinTOneNode
B2: IF (BTNode == NULL)
Thực hiện BKT
B3: BTNode ->BinTLeft = NULL
B4: BTNode ->BinTRight = NULL
B5: BTNode -> Key = NewData
BKT: Kết thúc

204


205


2. Cây nhị phân (Binary Tree)
2.2. b. Tạo mới 1 nút (tt)
Cài đặt thuật toán trong C++
BinTType BinTreeCreateNode(T NewData)
{
BinTType BTnode = new BinTOneNode;
if (BTnode != NULL)
{
BTnode-> BinTLeft = NULL;
BTnode-> BinTRight = NULL;
BTnode-> Key = NewData;
}
return (BTnode);
}


206

2. Cây nhị phân (Binary Tree)
2.2. c. Thêm 1 nút vào cây nhị phân (Thêm trái nhất) – Thuật toán
B1: NewNode = BinTreeCreateNode(NewData)
B2: IF (NewNode == NULL)
Thực hiện BKT
B3: IF (BinTree == NULL)
B3.1: BinTree = NewNode
B3.2: Thực hiện BKT
B4: Lnode = BinTree
B5: IF (Lnode->BinTLeft == NULL)
B5.1: Lnode-> BinTLeft = NewNode
B5.2: Thực hiện BKT

B6: Lnode = Lnode ->BinTLeft
B7: Lặp lại B5
BKT: Kết thúc


207

2. Cây nhị phân (Binary Tree)
2.2. c. Thêm 1 nút vào cây nhị phân (Thêm trái nhất)
Cài đặt thuật toán bằng C++
BinTType BinTreeAddLeft (BinTType &BTTree, T NewData)
{
BinTType NewNode = BinTreeCreateNode (NewData);
if (NewNode == NULL)
return (NewNode);
if (BTTree == NULL)
BTTree = NewNode;
else
{
BinTType Lnode = BTTree;
while (Lnode->BinTLeft != NULL)
Lnode = Lnode->BinTLeft;
Lnode->BinTLeft = NewNode;
}
return (NewNode);


208

2. Cây nhị phân (Binary Tree)

2.2. c. Thêm 1 nút vào cây nhị phân (Thêm phải nhất)-Thuật toán
B1: NewNode = BinTreeCreateNode(NewData)
B2: IF (NewNode == NULL)
Thực hiện BKT
B3: IF (BinTree == NULL)
B3.1: BinTree = NewNode
B3.2: Thực hiện BKT
B4: Rnode = BinTree
B5: IF (Rnode->BinTRight == NULL)
B5.1: Rnode->BinTRight = NewNode
B5.2: Thực hiện BKT
B6: Rnode = Rnode ->BinTRight
B7: Lặp lại B5
BKT: Kết thúc


209

2. Cây nhị phân (Binary Tree)
2.2. c. Thêm 1 nút vào cây nhị phân (Thêm phải nhất)
Cài đặt thuật toán bằng C++
BinTType BinTreeAddRight (BinTType &BTTree, T NewData)
{
BinTType NewNode = BinTreeCreateNode (NewData);
if (NewNode == NULL)
return (NewNode);
if (BTTree == NULL)
BTTree = NewNode;
else
{

BinTType Rnode = BTTree;
while (Rnode->BinTRight != NULL)
Rnode = Rnode->BinTRight;
Rnode->BinTRight = NewNode;
}
return (NewNode);
}


210

2. Cây nhị phân (Binary Tree)
2.2. d. Duyệt qua các nút trên cây nhị phân

Duyệt theo thứ tự nút gốc trước (Preoder): nút gốc được duyệt
trước, sau đó mới duyệt đến 2 nút con. Có 2 cách:



Duyệt nút gốc, duyệt cây con bên trái, duyệt cây con bên phải (Root Left - Right)
Duyệt nút gốc, duyệt cây con bên phải, duyệt cây con bên trái (Root Right - Left)

Duyệt theo thứ tự nút gốc giữa (Inoder): duyệt 1 trong 2 cây con
trước rồi duyệt nút gốc sau đó mới duyệt cây con cịn lại. Có 2 cách:





Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con bên phải (Left Root - Right)

Duyệt cây con bên phải, duyệt nút gốc, duyệt cây con bên trái (Right Root - Left)

Duyệt theo thứ tự nút gốc sau (Postoder): Nút gốc sẽ được duyệt
sau cùng sau khi duyệt 2 cây con.





Duyệt cây con bên trái, duyệt cây con bên phải, duyệt nút gốc(Left –
Right - Root)
Duyệt cây con bên phải, duyệt cây con bên trái, duyệt nút gốc(Right Left- Root )


211

2. Cây nhị phân (Binary Tree)
2.2. d. Duyệt qua các nút trên cây nhị phân – (Left-RootRight)
Thuật toán
Hàm duyệt đệ quy: LRootR
B1: CurrNode = BinTree
B2: IF (CurrNode == NULL)
Thực hiện BKT
B3: LRootR(BinTree->BinTLeft)
B4: Process (CurrNode->Key)
B5: LRootR(BinTree->BinTRight)
BKT: Kết thúc


212


2. Cây nhị phân (Binary Tree)
2.2. d. Duyệt qua các nút trên cây nhị phân – (Left-RootRight)
Cài đặt thuật toán trong C++
void BinTreeLRootRTravelling(BinTType BTTree)
{
if (BTTree == NULL)
return;
BinTreeLRootRTraveling(BTTree->BinTLeft);
Process (BTTree->Key);
BinTreeLRootRTraveling(BTTree->BinTRight);
return;
}


213

2. Cây nhị phân (Binary Tree)
2.2. e. Tính chiều cao của cây
B1: IF (BinTree == NULL)
B1.1: TH = 0
B1.2: Thực hiện BKT
B2: THL = TH(BinTree->BinTLeft)
B3: THR = TH(BinTree->BinTRight)
B4: IF(THL > THR)
TH = THL + 1
B5: ELSE
TH = THR + 1
BKT: Kết thúc
int BinTreeHeight (BinTType BTree)

{
if (BTree == NULL)
return (0);
int HTL = BinTreeHeight(BTree -> BinTLeft);
int HTR = BinTreeHeight(BTree -> BinTRight);
if (HTL > HTR)
return (HTL +1)
return (HTR +1);
}


×