Duyệt qua các nút trên cây nhị phân Duyệt nút gốc, duyệt cây con bên trái, duyệt cây con... Duyệt qua các nút trên cây nhị phân Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con... Kh
Trang 1Môn: CẤU TRÚC DỮ LIỆU
Chương 5: CÂY (TREE)
Trang 2NỘI DUNG CHƯƠNG 5
1. Khái niệm cây – Biểu diễn cây
2. Cây nhị phân (Binary Tree)
1. Định nghĩa
2. Biểu diễn và các thao tác
3. Cây nhị phân tìm kiếm (Binary Searching Tree)
3. Cây cân bằng (Balanced Tree)
1. Định nghĩa – Cấu trúc dữ liệu
2. Các thao tác trên cây cân bằng
BÀI TẬP
Trang 31.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.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
Trang 41.Khái niệm cây – Biểu diễn cây (tt)
1.1 Định nghĩa cây
đặc điểm
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ó 1 nút là gốc cây con
Trang 51.Khái niệm cây – Biểu diễn cây (tt)
1.2 Một số khái niệm cơ bản
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)
1.2.d Nút lá
Trang 61.Khái niệm cây – Biểu diễn cây (tt)
1.2 Một số khái niệm liên quan (tt)
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
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)
Trang 71.Khái niệm cây – Biểu diễn cây (tt)
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
Trang 81.Khái niệm cây – Biểu diễn cây (tt)
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 ngoà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.
Trang 91.Khái niệm cây – Biểu diễn cây (tt)
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
Trang 102 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)
Trang 112 Cây nhị phân (Binary Tree)
2.2 Biểu diễn và các thao tác
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:
Trang 122 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
Trang 132 Cây nhị phân (Binary Tree)
2.2 a Khởi tạo cây nhị phân (Tham khảo)
Khởi tạo cây nhịn phân: cho con trỏ quản lý địa chỉ nút gốc về con
Trang 142 Cây nhị phân (Binary Tree)
2.2 b Tạo mới 1 nút (Tham khảo)
Thuật toán
B1: TNode = 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
Key
NULL NULL
BTNode
Trang 152 Cây nhị phân (Binary Tree)
2.2 b Tạo mới 1 nút (tt) (Tham khảo)
Cài đặt thuật toán trong C++
{
BinTType BTnode = new BinTOneNode;
if (BTnode != NULL)
{
BTnode-> BinTLeft = NULL;
BTnode-> BinTRight = NULL;
BTnode-> Key = NewData;
}
return (BTnode);
Trang 162 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(Tham khảo)
Trang 172 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) (Tham khảo)
Cài đặt thuật toán bằng C++
BinTType BinTreeAddLeft (BinTType &BTTree, T NewData)
BinTType Lnode = BTTree;
while (Lnode->BinTLeft != NULL)
Trang 182 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(Tham
Trang 192 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++ (Tham khảo)
BinTType BinTreeAddRight (BinTType &BTTree, T NewData)
BinTType Rnode = BTTree;
while (Rnode->BinTRight != NULL)
Rnode = Rnode->BinTRight;
Rnode->BinTRight = NewNode;
}
return (NewNode);
Trang 202 Cây nhị phân (Binary Tree)
2.2 d Duyệt qua các nút trên cây nhị phân(Tham khảo)
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 )
Trang 212 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 nút gốc, duyệt cây con bên trái, duyệt cây con
Trang 222 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 cây con bên trái, duyệt nút gốc, duyệt cây con
Trang 232 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 cây con bên trái, duyệt cây con bên phải, duyệt
Trang 242 Cây nhị phân (Binary Tree)
2.2 d Duyệt qua các nút trên cây nhị phân
Vd: A,B,C,D,E,F,G
Trang 252 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 trong đó tại mỗi nút,
khoá của nút đang xét lớn hơn khóa của tất cả các nút thuộc cây con trái và nhỏ hơn khoá của tất các nút thuộc cây con phải
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
Trang 262 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 Thêm vào một phần tử X vào cây
Trang 272 Cây nhị phân (Binary Tree)
2.3.2.a Thêm vào một phần tử X vào cây
Việc thêm một phần tử x vào cây phải đảm bảo điều kiện ràng
buộc của CNPTK
Hàm insert trả về giá trị -1,0,1 khi không đủ bộ nhớ, gặp nút cũ
hay thành công:
Trang 282 Cây nhị phân (Binary Tree)
int InsertTree(TREE &T,int k)
{
if (T!=NULL)
{ //neu can ca so trung nhau thi bo dong ngay duoi
if (T->Info==k) return 0;
if (T->Info>k) return InsertTree(T->pL,k);
else return InsertTree(T->pR,k);
} else
Trang 292 Cây nhị phân (Binary Tree)
2.3.2.b Tạo một cây NPTK: Ta có thể tạo CNPTK bằng cách lặp
lại quá trình thêm 1 phần tử vào một cây rỗng
void CreateTree(TREE &T)
Trang 302 Cây nhị phân (Binary Tree)
if (k>T->Info) return SearchTree(T->pR,k);
else return SearchTree(T->pL,k);
}
Trang 312 Cây nhị phân (Binary Tree)
if (k>T->Info) return SearchTree1(T->pR,k);
else return SearchTree1(T->pL,k);
}
Trang 322 Cây nhị phân (Binary Tree)
2.3.2.e Huỷ một phần tử có khoá X
int DelTree(TREE &T,int k)
{
if (T==NULL) return 0;
if (T->Info>k) return DelTree(T->pL,k);
if (T->Info<k) return DelTree(T->pR,k);
TNode *q=T->pR;
SearchStandfor(p,q);
} delete(p);
Trang 332 Cây nhị phân (Binary Tree)
2.3.2.e Huỷ một phần tử có khoá X
void SearchStandfor(TREE &p,TREE &q)
Trang 342 Cây nhị phân (Binary Tree)
Trang 352 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
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
Trang 362 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 CurrNode = BSTree;
while (CurrNode !=NULL & CurrNode->Key != SeachData)
{
if (CurrNode ->Key > SearchData)
CurrNode = CurrNode ->BSTLeft;
Trang 372 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
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êm và thêm nút vào
cây
do đó nếu NewData trùng với Key của 1 trong các nút trong
cây thì không thực hiện thêm.
Trang 382 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)
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
Trang 392 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;
if (CurrNode->BSTRight != NULL)
CurrNode = CurrNode->BSTRight;
else break;
} }
Trang 402 Cây nhị phân (Binary Tree)
2.3.2.c Loại bỏ 1 nút trên cây
cho cây sau khi hủy nút đó thìcây vẫn là một cây nhị phân tìm kiếm
chúng ta sẽ biến cây thành một rừng
Giả sử chúng ta cần hủy nút có thành phần dữ liệu (Key) là
DelData ra khỏi cây nhịphân tìm kiếm
Hủy nút có địa chỉ là DelNode nàynếu tìm thấy
(Do vậy thuật toán này còn được gọi là thuật toán tìm kiếm và loại bỏtrên cây)
Trang 412 Cây nhị phân (Binary Tree)
2.3.2.c Loại bỏ 1 nút trên cây (tt)
Trong quá trình tìm kiếm cần giữ địa chỉ nút cha của nút cần
hủy là PrDelNode
Việc hủy nút có địa chỉ DelNode có thể xảy ra một trong ba
trường hợp sau:
Trang 422 Cây nhị phân (Binary Tree)
2.3.2.c Loại bỏ 1 nút trên cây - DelNode là nút lá
bằng cách cho con trỏ
Tiến hành hủy (delete) nút có địa chỉ DelNode này
Trang 432 Cây nhị phân (Binary Tree)
2.3.2.c Loại bỏ 1 nút trên cây - DelNode là nút có 01 cây con
cha-con giữa DelNode và cây con của nó và tiến hành hủy nút
có địa chỉ DelNode này
Trang 442 Cây nhị phân (Binary Tree)
2.3.2.c Loại bỏ 1 nút trên cây - DelNode là nút có 02 cây con
một trong hai cách sau đây
C1: Chuyển 02 cây con của DelNode về thành một cây con:
DelNode về thành cây con phải của cây con có nút gốc là nút
phảinhất trong cây con trái của DelNode
hoặc
củacây con có nút gốc là nút trái nhất trong cây con phải của DelNode
Sau khi chuyển thì DelNode sẽ trở thành nút lá hoặc nút chỉ
có 01 cây con và chúng ta hủy DelNode như đối với trường
Trang 452 Cây nhị phân (Binary Tree)
2.3.2.c Loại bỏ 1 nút trên cây - DelNode là nút có 02 cây con
C2: Sử dụng phần tử thế mạng (standby):
của phần tử thế mạng là nút phải nhất trong cây con trái của
của DelNode (MLNode)
cho DelNode (DelNodeKey = MRNode->Key hoặc
DelNode->Key = MLNode-DelNode->Key) thì hủy nút thế mạng như đối với
trường hợp trên
Trang 462 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;
}
Trang 473 Cây cân bằng (Balanced Tree)
3.1 Định nghĩa – Cấu trúc dữ liệu
Cây cân bằng tương đối:
Là cây nhị phân thỏa mãn điều kiện là đối với mọi nút của
cây thì chiều cao của cây con trái và chiều cao của cây con phải của nút đó hơn kém nhau không quá 1 (theo định
nghĩa của Adelson-Velskii và Landis)
Cây cân bằng hoàn toàn:
Là cây nhị phân thỏa mãn điều kiện là đối với mọi nút của
cây thì số nút của cây con trái và số nút của cây con phải
của nút đó hơn kém nhau không quá 1
Trang 483 Cây cân bằng (Balanced Tree)
3.1 Định nghĩa – Cấu trúc dữ liệu (tt)
thêm thành phần Bal trong cấu trúc dữ liệu của mỗi nút
typedef struct BALNode
Để quản lý cây cân bằng, chỉ cần quản lý địa chỉ nút gốc của
Trang 493 Cây cân bằng (Balanced Tree)
3.1 Định nghĩa – Cấu trúc dữ liệu (tt)
Giá trị chỉ số cân bằng Bal tại 1 nút gốc của cây con trong cây
cân bằng tương đối bằng hiệu số giữa chiều cao cây con trái
và chiều cao cây con phải của nút đó
Giá trị chỉ số cân bằng Bal tại 1 nút gốc của cây con trong cây
cân bằng hoàn toàn = hiệu số giữa số nút cây con trái và số nút cây con phải của nút đó
-1 <= Bal <= 1 thì cây là cây cân bằng Phạm vi từ -1 1 là phạm vi cho phép của chỉ số cân bằng Bal
Nếu Bal = 0: cây con trái & cây con phải đều nhau
Nếu Bal = -1: cây con trái nhỏ hơn cây con phải (lệch phải)
Trang 503 Cây cân bằng (Balanced Tree)
3.2 Các thao tác trên cây cân bằng
Các thao tác trên cây cân bằng áp dụng cho cây nhị phân tìm
kiếm cân bằng tương đối
3.2.a Thêm 1 nút vào cây cân bằng
3.2.b Hủy một nút khỏi cây cân bằng
Trang 513 Cây cân bằng (Balanced Tree)
3.2.a Thêm 1 nút vào cây cân bằng
vào trong cây cân bằng BALTree sao cho sau khi thêm
BALTree vẫn là một cây cân bằng
Để thực hiện điều này cần tìm kiếm vị trí của nút cần thêm là
nút con trái hoặc nút con phải của một nút PrNewNode tương
tự như trong cây nhị phân tìm kiếm
của PrNewNode thì chỉ số cân bằng của các nút từ
PrNewNode trở về các nút trước sẽ bị thay đổi dây chuyền và chúng ta phải lần ngược từ
Trang 523 Cây cân bằng (Balanced Tree)
3.2.a Thêm 1 nút vào cây cân bằng
quá phạm vi cho phép (bằng –2 hoặc +2) thì tiến hành cân
bằng lại cây ngay tại nút AncestorNode này
thể theo các trường hợp như sau:
Trường hợp 1: Nếu AncestorNode->Bal = -2:
(AncR->Bal = -1)
(AncR->Bal = 1)
Trang 533 Cây cân bằng (Balanced Tree)
3.2.a Thêm 1 nút vào cây cân bằng
quá phạm vi cho phép (bằng –2 hoặc +2) thì chúng ta tiến
hành cân bằng lại cây ngay tại nút AncestorNode này
thể theo các trường hợp như sau:
Trường hợp 1: Nếu AncestorNode->Bal = -2:
(AncR->Bal = -1)
(AncR->Bal = 1)
Trang 543 Cây cân bằng (Balanced Tree)
3.2.a (tt) Trường hợp 1: Nếu AncestorNode->Bal = -2:
Gọi: AncL = AncestorNode->BAL_Left
AncR = AncestorNode->BAL_Right
=>AncL có chiều cao là h và AncR có chiều cao là h+2 (h 0)
=>Có ít nhất 1 cây con của AncR có chiều cao là h+1
Gọi: AncRL = AncR->BAL_Left
AncRR = AncR->BAL_Right