Upload
phil
View
64
Download
5
Embed Size (px)
DESCRIPTION
TREES (Cấu trúc cây). Mục tiêu. Giới thiệu khái niệm cấu trúc cây . Cấu trúc dữ liệu cây nhị phân tìm kiếm : tổ chức , các thuật toán , ứng dụng . Giới thiệu cấu trúc dữ liệu cây nhị phân tìm kiếm. Cấu trúc cây. Cấu trúc cây. - PowerPoint PPT Presentation
Citation preview
TREESTREES
(Cấu (Cấu trúctrúc cây)cây)
Caáu truùc Döõ lieäu - Caáu truùc caây 2
MụcMục tiêutiêu
GiớiGiới thiệuthiệu kháikhái niệmniệm cấucấu trúctrúc câycây.. CấuCấu trúctrúc dữdữ liệuliệu câycây nhịnhị phânphân tìmtìm kiếmkiếm: : tổtổ
chứcchức, , cáccác thuậtthuật toántoán, , ứngứng dụngdụng.. GiớiGiới thiệuthiệu cấucấu trúctrúc dữdữ liệuliệu câycây nhịnhị phânphân
tìm kiếmtìm kiếm
CấuCấu trúctrúc câycây
Caáu truùc Döõ lieäu - Caáu truùc caây 4
CấuCấu trúctrúc câycây
ĐịnhĐịnh nghĩanghĩa : : câycây làlà mộtmột tậptập hợphợp TT cáccác phầnphần tửtử ((gọigọi làlà nútnút củacủa câycây) ) trongtrong đóđó cócó 1 1 nútnút đặcđặc biệtbiệt đượcđược gọigọi làlà gốcgốc, , cáccác nútnút còncòn lạilại đượcđược chiachia thànhthành nhữngnhững tậptập rờirời nhaunhau TT11, , TT22 , ... , , ... , TnTn theotheo quanquan hệhệ phânphân cấpcấp trongtrong đóđó TiTi cũngcũng làlà mộtmột câycây. . MỗiMỗi nútnút ở ở cấpcấp ii sẽsẽ quảnquản lýlý mộtmột sốsố nútnút ở ở cấpcấp ii+1. +1. QuanQuan hệhệ nàynày ngườingười tata còncòn gọigọi làlà quanquan hệhệ chacha--concon..
Caáu truùc Döõ lieäu - Caáu truùc caây 5
CấuCấu trúctrúc câycây
Caáu truùc Döõ lieäu - Caáu truùc caây 6
CấuCấu trúctrúc câycây
Caáu truùc Döõ lieäu - Caáu truùc caây 7
CấuCấu trúctrúc câycâyMộtMột sốsố kháikhái niệmniệm cơcơ bảnbản
BậcBậc củacủa mộtmột nútnút : : làlà sốsố câycây concon củacủa nútnút đóđó BậcBậc củacủa mộtmột câycây : : làlà bậcbậc lớnlớn nhấtnhất củacủa cáccác nútnút trongtrong câycây ( (sốsố câycây
concon tốitối đađa củacủa mộtmột nútnút thuộcthuộc câycây ). ). CâyCây cócó bậcbậc nn thìthì gọigọi làlà câycây nn--phânphân. .
NútNút gốcgốc : : làlà nútnút khôngkhông cócó nútnút chacha. . NútNút lálá : : làlà nútnút cócó bậcbậc bằngbằng 0 . 0 . NútNút nhánhnhánh : : làlà nútnút cócó bậcbậc kháckhác 0 0 vàvà khôngkhông phảiphải làlà gốcgốc . . MứcMức củacủa mộtmột nút nút ::
MứcMức ( (gốcgốc ( (TT) ) = 0. ) ) = 0. GọiGọi TT11, , TT22, , TT33, ... , , ... , TnTn làlà cáccác câycây concon củacủa TT00 MứcMức ( (TT11) = ) = MứcMức ( (TT22) = ... = ) = ... = MứcMức ( (TnTn) = ) = MứcMức ( (TT00) + 1.) + 1.
Caáu truùc Döõ lieäu - Caáu truùc caây 8
CấuCấu trúctrúc câycâyMộtMột sốsố kháikhái niệmniệm cơcơ bảnbản
ĐộĐộ dàidài đườngđường điđi từtừ gốcgốc đếnđến nútnút x x :: làlà sốsố nhánhnhánh cầncần điđi quaqua kểkể từtừ gốcgốc đếnđến xx
ĐộĐộ dàidài đườngđường điđi tổngtổng củacủa câycây : :
trongtrong đóđó PxPx làlà độđộ dàidài đườngđường điđi từtừ gốcgốc đếnđến XX.. ĐộĐộ dàidài đườngđường điđi trungtrung bìnhbình : : PIPI = = PTPT//nn ( (nn làlà sốsố nútnút
trêntrên câycây TT).). RừngRừng câycây:: làlà tậptập hợphợp nhiềunhiều câycây trongtrong đóđó thứthứ tựtự cáccác câycây
làlà quanquan trọngtrọng..
TX
XT PP
Caáu truùc Döõ lieäu - Caáu truùc caây 9
Khái niệmKhái niệm
J
Z A
DRB
LFAKQ Lá
nút
gốcCạnh
Caáu truùc Döõ lieäu - Caáu truùc caây 10
CấuCấu trúctrúc câycâyMộtMột sốsố víví dụdụ vềvề đốiđối tượngtượng cáccác cấucấu trúctrúc dạngdạng câycây
SơSơ đồđồ tổtổ chứcchức củacủa mộtmột côngcông tyty
BB-Electronic Corp.BB-Electronic Corp.
R&DR&D Kinh doanhKinh doanh Taøi vuïTaøi vuï Saûn xuaátSaûn xuaát
TVTV CDCD AmplierAmplierNoäi ñòaNoäi ñòa Quoác teáQuoác teá
Chaâu aâuChaâu aâu MyõMyõ Caùc Caùc nöôùcnöôùc
Caáu truùc Döõ lieäu - Caáu truùc caây 11
CấuCấu trúctrúc câycâyMộtMột sốsố víví dụdụ vềvề đốiđối tượngtượng cáccác cấucấu trúctrúc dạngdạng câycây
MụcMục lụclục mộtmột quyểnquyển sáchsách
Student guideStudent guide
Giôùi Giôùi thieäuthieäu
ÑieåmÑieåm Moâi Moâi tröôøngtröôøng
NN LTNN LT CT CT maãumaãu
Baøi Baøi taäptaäp
Thöïc Thöïc haønhhaønh
ThiThi
Caáu truùc Döõ lieäu - Caáu truùc caây 12
CấuCấu trúctrúc câycây
NhậnNhận xétxét::TrongTrong cấucấu trúctrúc câycây khôngkhông tồntồn tạitại chuchu trìnhtrình
CâyCây nhịnhị phânphân
Caáu truùc Döõ lieäu - Caáu truùc caây 14
CâyCây nhịnhị phânphân
ĐịnhĐịnh nghĩanghĩa: : CâyCây nhịnhị phânphân làlà câycây màmà mỗimỗi nútnút cócó tốitối đađa 2 2 câycây concon
TrongTrong thựcthực tếtế thườngthường gặpgặp cáccác cấucấu trúctrúc cócó dạngdạng câycây nhịnhị phânphân. . MộtMột câycây tổngtổng quátquát cócó thểthể biểubiểu diễndiễn thôngthông quaqua câycây nhịnhị phânphân..
Caáu truùc Döõ lieäu - Caáu truùc caây 15
CâyCây nhịnhị phânphân
Cây con trái
Cây con phải
Hình ảnh một cây nhị phân
Caáu truùc Döõ lieäu - Caáu truùc caây 16
CâyCây nhịnhị phânphân
Figure 7.3: Binary tree structure.
Caáu truùc Döõ lieäu - Caáu truùc caây 17
CâyCây nhịnhị phânphân
Figure 7.4: Skewed trees.
Caáu truùc Döõ lieäu - Caáu truùc caây 18
CâyCây nhịnhị phânphân CâyCây nhịnhị phânphân dùngdùng đểđể biểubiểu diễndiễn mộtmột biểubiểu thứcthức toántoán họchọc::
Caáu truùc Döõ lieäu - Caáu truùc caây 19
CâyCây nhịnhị phânphân MộtMột sốsố tínhtính chấtchất củacủa câycây nhịnhị phânphân
SốSố nútnút nằmnằm ở ở mứcmức ii Chiều cao cây h là mức cao Chiều cao cây h là mức cao
nhất + 1.nhất + 1. SốSố nútnút lálá 2 2hh-1-1, , vớivới hh làlà
chiềuchiều caocao củacủa câycây.. ChiềuChiều caocao củacủa câycây hh loglog22((sốsố
nútnút trongtrong câycây).). SốSố nútnút trongtrong câycây 2 2hh-1.-1. Đường đi (path)Đường đi (path)
Tên các node của quá trình đi Tên các node của quá trình đi từ node gốc theo các cây con từ node gốc theo các cây con đến một node nào đó.đến một node nào đó.
i2Mức
Caáu truùc Döõ lieäu - Caáu truùc caây 20
CâyCây nhịnhị phânphân BiểuBiểu diễndiễn câycây nhịnhị phânphân TT
CâyCây nhịnhị phânphân làlà mộtmột cấucấu trúctrúc baobao gồmgồm cáccác phầnphần tửtử ((nútnút) ) đượcđược kếtkết nốinối vớivới nhaunhau theotheo quanquan hệhệ “cha“cha--con”con” vớivới mỗimỗi chacha cócó tốitối đađa 2 2 concon. . ĐểĐể biểubiểu diễndiễn câycây nhịnhị phânphân tata chọnchọn phươngphương pháppháp cấpcấp phátphát liênliên kếtkết. . ỨngỨng vớivới mộtmột nútnút, , tata sửsử dụngdụng mộtmột biếnbiến độngđộng lưulưu trữtrữ cáccác thôngthông tintin sausau:: ThôngThông tintin lưulưu trữtrữ tạitại nútnút.. ĐịaĐịa chỉchỉ nútnút gốcgốc củacủa câycây concon tráitrái trongtrong bộbộ nhớnhớ.. ĐịaĐịa chỉchỉ nútnút gốcgốc củacủa câycây concon phảiphải trongtrong bộbộ nhớnhớ..
Caáu truùc Döõ lieäu - Caáu truùc caây 21
CâyCây nhịnhị phânphân
Caáu truùc Döõ lieäu - Caáu truùc caây 22
CâyCây nhịnhị phânphân Để đơn giản, ta khai báo cấu trúc dữ liệu như sau :Để đơn giản, ta khai báo cấu trúc dữ liệu như sau :
typedef struct typedef struct NODENODE
{{
intint data; data;
NODE*NODE* left; left;
NODE*NODE* right; right;
};};
typedef struct typedef struct NODENODE* * TREETREE;;
TREETREE root; root;
Caáu truùc Döõ lieäu - Caáu truùc caây 23
CâyCây nhịnhị phânphân DuyệtDuyệt câycây nhịnhị phânphân
CóCó 33 kiểukiểu duyệtduyệt chínhchính cócó thểthể ápáp dụngdụng trêntrên câycây nhịnhị phânphân: : DuyệtDuyệt theotheo thứthứ tựtự trướctrước ( (NLRNLR)- Preorder)- PreorderDuyệtDuyệt theotheo thứthứ tựtự giữagiữa ( (LNRLNR)- Inorder)- InorderDuyệtDuyệt theotheo thứthứ tựïtựï sausau ( (LRNLRN)- Postorder)- Postorder
TênTên củacủa 33 kiểukiểu duyệtduyệt nàynày đượcđược đặtđặt dựadựa trêntrên trìnhtrình tựtự củacủa việcviệc thămthăm nútnút gốcgốc soso vớivới việcviệc thămthăm 2 2 câycây concon..
Caáu truùc Döõ lieäu - Caáu truùc caây 24
CâyCây nhịnhị phânphân DuyệtDuyệt theotheo thứthứ tựtự trướctrước ( (NodeNode--LeftLeft--RightRight) )
KiểuKiểu duyệtduyệt nàynày trướctrước tiêntiên thămthăm nútnút gốcgốc sausau đóđó thămthăm cáccác nútnút củacủa câycây concon tráitrái rồirồi đếnđến câycây concon phảiphải. .
ThủThủ tụctục duyệtduyệt cócó thểthể trìnhtrình bàybày đơnđơn giảngiản nhưnhư sausau::
void NLR(TREE root){if (Root != NULL){
<Xử lý Root>;//Xử lý tương ứng theo nhu cầuNLR(root->left);NLR(root->right);
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 25
CâyCây nhịnhị phânphân DuyệtDuyệt theotheo thứthứ tựtự trướctrước ( (NodeNode--LeftLeft--RightRight) )
MộtMột víví dụdụ: : đọcđọc mộtmột quyểnquyển sáchsách hayhay bàibài báobáo từtừ đầuđầu đếnđến cuốicuối nhưnhư minhminh họahọa trongtrong hìnhhình bênbên dướidưới::
Caáu truùc Döõ lieäu - Caáu truùc caây 26
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả: B D H I N E J O K C F L P G M
Duyệt theo thứ tự trước (Node-Left-Right)Duyệt theo thứ tự trước (Node-Left-Right)
Caáu truùc Döõ lieäu - Caáu truùc caây 27
Cây nhị phân Cây nhị phân Duyệt theo thứ tự giữa (Left- Node-Right)Duyệt theo thứ tự giữa (Left- Node-Right)
Kiểu duyệt này trước tiên thăm các nút của cây con trái sau đó thăm Kiểu duyệt này trước tiên thăm các nút của cây con trái sau đó thăm nút gốc rồi đến cây con phải. nút gốc rồi đến cây con phải.
Thủ tục duyệt có thể trình bày đơn giản như sau: Thủ tục duyệt có thể trình bày đơn giản như sau: void LNR(TREE root){
if (root != NULL){
LNR(root->left);<Xử lý Root>; //Xử lý tương ứng theo nhu cầuLNR(root->right);
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 28
Duyệt theo thứ tự giữa (Left- Node-Right)Duyệt theo thứ tự giữa (Left- Node-Right)A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả: D N I B J O E K A F P L C M G
Caáu truùc Döõ lieäu - Caáu truùc caây 29
Cây nhị phân Cây nhị phân
Duyệt theo thứ tự sau (Left-Right-Node)Duyệt theo thứ tự sau (Left-Right-Node) Kiểu duyệt này trước tiên thăm các nút của cây con trái sau đó thăm Kiểu duyệt này trước tiên thăm các nút của cây con trái sau đó thăm
đến cây con phải rồi cuối cùng mới thăm nút gốc. đến cây con phải rồi cuối cùng mới thăm nút gốc. Thủ tục duyệt có thể trình bày đơn giản như sau: Thủ tục duyệt có thể trình bày đơn giản như sau:
void LRN(TREE root){
if (root != NULL){
LRN(root->left);LRN(root->right);<Xử lý Root>; //Xử lý tương ứng theo nhu cầu
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 30
Cây nhị phân Cây nhị phân
Duyệt theo thứ tự sau (Left-Right-Node)Duyệt theo thứ tự sau (Left-Right-Node) Một ví dụ quen thuộc Một ví dụ quen thuộc
trong tin học về ứng trong tin học về ứng dụng của duyệt theo dụng của duyệt theo thứ tự sau là việc xác thứ tự sau là việc xác định tổng kích thước định tổng kích thước của một thư mục trên của một thư mục trên đĩađĩa
Caáu truùc Döõ lieäu - Caáu truùc caây 31
Duyệt theo thứ tự sau (Left-Right-Node)Duyệt theo thứ tự sau (Left-Right-Node)A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả: N I D O J K E B P L F M G C A
Caáu truùc Döõ lieäu - Caáu truùc caây 32
CâyCây nhịnhị phânphân DuyệtDuyệt theotheo thứthứ tựtự sausau ( (LeftLeft--RightRight--NodeNode) )
TínhTính toántoán giágiá trịtrị củacủa biểubiểu thứcthức dựadựa trêntrên câycây biểubiểu thứcthức
(3 + 1)3/(9 – 5 + 2) – (3(7 – 4) + 6) = –13
Caáu truùc Döõ lieäu - Caáu truùc caây 33
CâyCây nhịnhị phânphân MộtMột cáchcách biểubiểu diễndiễn câycây nhịnhị phânphân kháckhác
ĐôiĐôi khikhi, , khikhi địnhđịnh nghĩanghĩa câycây nhịnhị phânphân, , ngườingười tata quanquan tâmtâm đếnđến cảcả quanquan hệhệ 2 2 chiềuchiều chacha concon chứchứ khôngkhông chỉchỉ mộtmột chiềuchiều nhưnhư địnhđịnh nghĩanghĩa ở ở phầnphần trêntrên. .
LúcLúc đóđó, , cấucấu trúctrúc câycây nhịnhị phânphân cócó thểthể địnhđịnh nghĩanghĩa lạilại nhưnhư sausau:: typedef struct tagTNode{
DataType Key;struct tagTNode* pParent;struct tagTNode* pLeft;struct tagTNode* pRight;
}TNODE;typedef TNODE *TREE;
Caáu truùc Döõ lieäu - Caáu truùc caây 34
CâyCây nhịnhị phânphân MộtMột cáchcách biểubiểu diễndiễn câycây nhịnhị phânphân kháckhác
CâyCây nhịnhị phânphân tìmtìm kiếmkiếm (Binary search tree)(Binary search tree)
Caáu truùc Döõ lieäu - Caáu truùc caây 36
CâyCây nhịnhị phânphân tìmtìm kiếm (BST)kiếm (BST)
ĐịnhĐịnh nghĩanghĩa: : câycây nhịnhị phânphân tìmtìm kiếmkiếm ( (BSTBST) ) làlà câycây nhịnhị phânphân trongtrong đóđó tạitại mỗimỗi nútnút, , khóakhóa củacủa nútnút đangđang xétxét lớnlớn hơnhơn khóakhóa củacủa tấttất cảcả cáccác nútnút thuộcthuộc câycây concon tráitrái vàvà nhỏnhỏ hơnhơn khóakhóa củacủa tấttất cảcả cáccác nútnút thuộcthuộc câycây concon phảiphải..
NếuNếu sốsố nútnút trêntrên câycây làlà NN thìthì chichi phíphí tìmtìm kiếmkiếm trungtrung bìnhbình chỉchỉ khoảngkhoảng loglog22NN..
Caáu truùc Döõ lieäu - Caáu truùc caây 37
CâyCây nhịnhị phânphân tìmtìm kiếmkiếm
4444
1818 8888
1313 3737 5959 108108
1515 2323 4040 5555 7171
Caáu truùc Döõ lieäu - Caáu truùc caây 38
Cấu trúc dữ liệuCấu trúc dữ liệutypedef struct typedef struct NODENODE
{{
intint data; data;
NODE*NODE* left; left;
NODE*NODE* right; right;
};};
typedef struct typedef struct NODENODE* * TREETREE;;
TREETREE root; root;
Caáu truùc Döõ lieäu - Caáu truùc caây 39
Các thao tác trên BSTCác thao tác trên BSTa. Khởi tạo cây BSTa. Khởi tạo cây BST
Khởi tạo cây BST: cho con trỏ quản lý địa chỉ nút gốc về con Khởi tạo cây BST: cho con trỏ quản lý địa chỉ nút gốc về con trỏ NULLtrỏ NULL
void void InitInit(Node &root)(Node &root)
{{
root = NULL;root = NULL;
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 40
Các thao tác trên BSTCác thao tác trên BSTTạo node:Tạo node:Node* Node* GetNode GetNode (int x)(int x){{p= p= newnew Node; Node;ifif (p != NULL) (p != NULL){{
p-> Left = NULL;p-> Left = NULL;p-> Right = NULL;p-> Right = NULL;p-> Data = x;p-> Data = x;
}}returnreturn (p); (p);
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 41
Thêm một nút vào cây BSTThêm một nút vào cây BSTint int InsertTreeInsertTree(tree &root , int x)(tree &root , int x){{
ifif(root != NULL)(root != NULL){{
ifif(root->data==x) (root->data==x) returnreturn 0; 0;
ifif(root->data>x) (root->data>x) return return InsertTreeInsertTree(root->letf,x);(root->letf,x);elseelse returnreturn InsertTreeInsertTree(root->right,x);(root->right,x);
}}elseelse
Caáu truùc Döõ lieäu - Caáu truùc caây 42
elseelse
{{
root= root= newnew node; node;
if(root==NULL) if(root==NULL) returnreturn -1; -1;
root->data=x;root->data=x;
root->left=root->right=NULL;root->left=root->right=NULL;
returnreturn 1; 1;
}}
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 43
Tạo cây nhị phân tìm kiếmTạo cây nhị phân tìm kiếm Ta có thể tạo một cây nhị phân tìm kiếm bằng cách lặp lại Ta có thể tạo một cây nhị phân tìm kiếm 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. quá trình thêm 1 phần tử vào một cây rỗng.
void void CreateTreeCreateTree(tree &root)(tree &root)
{{
intint x,n; x,n;
coutcout<<“Nhap n = “; cin>>n;<<“Nhap n = “; cin>>n;
forfor((intint i=1; i<=n;i++) i=1; i<=n;i++)
{{
coutcout<<“Nhap gia tri:”; <<“Nhap gia tri:”; cincin>>x;>>x;
InsertTreeInsertTree(root,x);(root,x);
}}
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 44
Tạo cây nhị phân tìm kiếmTạo cây nhị phân tìm kiếm
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
25 37 10 18 29 50 3 1 6 5 12 20 35 13 32 41
25 37 10 18 29 50 3 1 6 5 12 20 35 13 32 41
Caáu truùc Döõ lieäu - Caáu truùc caây 45
DuyệtDuyệt câycây nhịnhị phânphân tìmtìm kiếmkiếm
ThaoThao táctác duyệtduyệt câycây trêntrên câycây nhịnhị phânphân tìmtìm kiếmkiếm hoànhoàn toàntoàn giốnggiống nhưnhư trêntrên câycây nhịnhị phânphân. .
LưuLưu ýý: : khikhi duyệtduyệt theotheo thứthứ tựtự giữagiữa, , trìnhtrình tựtự cáccác nútnút duyệtduyệt quaqua sẽsẽ chocho tata mộtmột dãydãy cáccác nútnút theotheo thứthứ tựtự tăngtăng dầndần củacủa khóakhóa..
Caáu truùc Döõ lieäu - Caáu truùc caây 46
DuyệtDuyệt câycây nhịnhị phânphân tìmtìm kiếmkiếm Duyệt theo thứ tự trước – Duyệt theo thứ tự trước – (Node-(Node-Left-RightLeft-Right):):
Duyệt nút gốc, duyệt cây con bên trái, duyệt cây con Duyệt nút gốc, duyệt cây con bên trái, duyệt cây con bên phảibên phảivoidvoid NLRNLR(TREE root)(TREE root)
{{
ifif (root!=NULL) (root!=NULL)
{{
coutcout<<root->data<<" ";<<root->data<<" ";
NLRNLR(root->left);(root->left);
NLRNLR(root->right);(root->right);
}}
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 47
DuyệtDuyệt câycây nhịnhị phânphân tìmtìm kiếmkiếm Duyệt theo thứ tự giữa – Duyệt theo thứ tự giữa – ((Left-Left-Node-Node-RightRight):):
Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con bên phảibên phảivoidvoid LNRLNR(TREE root)(TREE root)
{{
ifif (root!=NULL) (root!=NULL)
{{
LNRLNR(root->left);(root->left);
coutcout<<root->data<<" ";<<root->data<<" ";
LNRLNR(root->right);(root->right);
}}
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 48
DuyệtDuyệt câycây nhịnhị phânphân tìmtìm kiếmkiếm Duyệt theo thứ tự sau – Duyệt theo thứ tự sau – ((LeftLeft--Right-Right-Node):Node):
Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con bên phảibên phảivoidvoid LRNLRN(TREE root)(TREE root)
{{
ifif (root!=NULL) (root!=NULL)
{{
LRNLRN(root->left);(root->left);
LRNLRN(root->right);(root->right);
coutcout<<root->data<<" ";<<root->data<<" ";
}}
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 49
TìmTìm mộtmột phầnphần tửtử xx trongtrong câycây ((đệđệ quyquy))
TìmTìm mộtmột phầnphần tửtử xx trongtrong câycây ( (đệđệ quyquy):):NODE* searchNode(TREE root, int X){
if(root!=NULL){
if(root->data == X)return root;
if(root->data > X)return searchNode(root->left, X);
return searchNode(root->right, X);}return NULL;
}
Caáu truùc Döõ lieäu - Caáu truùc caây 50
TìmTìm mộtmột phầnphần tửtử xx trongtrong câycây ((khôngkhông đệđệ quyquy))
TìmTìm mộtmột phầnphần tửtử xx trongtrong câycây ( (khôngkhông đệđệ quyquy):):NODENODE * * searchNodesearchNode((TREETREE root, root, intint x) x){ {
TNODETNODE *p = root; *p = root;whilewhile (p != (p != NULLNULL)){{
ifif(x == p->data) (x == p->data) returnreturn p; p;elseelse
ifif(x < p->data) p = p->left;(x < p->data) p = p->left;elseelse p = p->right;p = p->right;
}}returnreturn NULLNULL;;
}}
Caáu truùc Döõ lieäu - Caáu truùc caây 51
TìmTìm mộtmột phầnphần tửtử x=13x=13 trongtrong câycây
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tìm kiếm 13
Khác nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tìm thấySố node duyệt: 5Số lần so sánh: 9
Caáu truùc Döõ lieäu - Caáu truùc caây 52
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tìm kiếm 13
Khác nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tìm thấySố node duyệt: 5Số lần so sánh: 9
TìmTìm mộtmột phầnphần tửtử x=13x=13 trongtrong câycây
Caáu truùc Döõ lieäu - Caáu truùc caây 53
TìmTìm mộtmột phầnphần tửtử xx trongtrong câycây
NhậnNhận xétxét:: SốSố lầnlần soso sánhsánh tốitối đađa phảiphải thựcthực hiệnhiện đểđể tìmtìm phầnphần tửtử XX
làlà hh, , vớivới hh làlà chiềuchiều caocao củacủa câycây. . NhưNhư vậyvậy thaothao táctác tìmtìm kiếmkiếm trêntrên CNPTKCNPTK cócó nn nútnút tốntốn
chichi phíphí trungtrung bìnhbình khoảngkhoảng OO((loglog22nn) .) .
Caáu truùc Döõ lieäu - Caáu truùc caây 54
TìmTìm mộtmột phầnphần tửtử xx trongtrong câycây
44
18 88
13 37 59 108
15 23 40 55 71
Tìm X=5544 < X
88 > X
59 > X
Caáu truùc Döõ lieäu - Caáu truùc caây 55
TìmTìm mộtmột phầnphần tửtử xx trongtrong câycây
Caáu truùc Döõ lieäu - Caáu truùc caây 56
ThêmThêm mộtmột phầnphần tửtử xx vàovào câycây
ThêmThêm mộtmột phầnphần tửtử xx vàovào câycây:: ViệcViệc thêmthêm mộtmột phầnphần tửtử XX vàovào câycây phảiphải bảobảo đảmđảm điềuđiều
kiệnkiện ràngràng buộcbuộc củacủa CNPTKCNPTK. . TaTa cócó thểthể thêmthêm vàovào nhiềunhiều chỗchỗ kháckhác nhaunhau trêntrên câycây, , nhưngnhưng nếunếu thêmthêm vàovào mộtmột nútnút ngoàingoài sẽsẽ làlà tiệntiện lợilợi nhấtnhất dodo tata cócó thểthể thựcthực hiênhiên quáquá trìnhtrình tươngtương tựtự thaothao táctác tìmtìm kiếmkiếm. . KhiKhi chấmchấm dứtdứt quáquá trìnhtrình tìmtìm kiếmkiếm cũngcũng chínhchính làlà lúclúc tìmtìm đượcđược chỗchỗ cầncần thêmthêm. .
HàmHàm insertinsert trảtrả vềvề giágiá trịtrị ––1, 0, 1 1, 0, 1 khikhi khôngkhông đủđủ bộbộ nhớnhớ, , gặpgặp nútnút cũcũ hayhay thànhthành côngcông::
Caáu truùc Döõ lieäu - Caáu truùc caây 57
ThêmThêm mộtmột phầnphần tửtử xx vàovào câycây
int insertNode(TREE &root, Data X){ if (root) {
if(root->data == X) return 0; // đã cóif(root->data > X)
return insertNode(root->left, X);else
return insertNode(root->right, X);}root = new Node;if (root == NULL) return -1; // thiếu bộ nhớroot->data = X;root->left = root->right = NULL;return 1; // thêm vào thành công
}
Caáu truùc Döõ lieäu - Caáu truùc caây 58
ThêmThêm mộtmột phầnphần tửtử xx vàovào câycây
44
18 88
13 37 59 108
15 23 40 55 71
Theâm X=50
44 < X
88 > X
59 > X
50
55 > X
Caáu truùc Döõ lieäu - Caáu truùc caây 59
HủyHủy mộtmột phầnphần tửtử cócó khóakhóa xx
ViệcViệc hủyhủy mộtmột phầnphần tửtử XX rara khỏikhỏi câycây phảiphải bảobảo đảmđảm điềuđiều kiệnkiện ràngràng buộcbuộc củacủa CNPTKCNPTK. .
CóCó 3 3 trườngtrường hợphợp khikhi hủyhủy nútnút XX cócó thểthể xảyxảy rara:: XX làlà nútnút lálá.. XX chỉchỉ cócó 1 1 concon ( (tráitrái hoặchoặc phảiphải).). XX cócó đủđủ cảcả 2 2 concon
Caáu truùc Döõ lieäu - Caáu truùc caây 60
Hủy một phần tử có khóa xHủy một phần tử có khóa xTrường hợp 1: X là nút lá.Trường hợp 1: X là nút lá.
1. Xóa node này2. Gán liên kết từ cha của nó thành rỗng
Caáu truùc Döõ lieäu - Caáu truùc caây 61
HủyHủy mộtmột phầnphần tửtử cócó khóakhóa xxTrườngTrường hợphợp 1: 1: XX làlà nútnút lálá. .
Ví dụVí dụ : : chỉchỉ đơnđơn giảngiản hủyhủy XX vìvì nónó khôngkhông mócmóc nốinối đếnđến phầnphần tửtử nàonào kháckhác..
44
18 88
13 37 59 108
15 23 40 55 71
T/h 1: huûy X=40
Caáu truùc Döõ lieäu - Caáu truùc caây 62
Hủy một phần tử có khóa xHủy một phần tử có khóa xTrường hợp 2: X chỉ có 1 con (trái hoặc phải)Trường hợp 2: X chỉ có 1 con (trái hoặc phải)
1. Gán liên kết từ cha của nó xuống con duy nhất của nó2. Xóa node này
u
x
v
u
v
Caáu truùc Döõ lieäu - Caáu truùc caây 63
HủyHủy mộtmột phầnphần tửtử cócó khóakhóa xxTrườngTrường hợphợp 2: 2: XX chỉchỉ cócó 1 1 concon ( (tráitrái hoặchoặc phảiphải) )
TrườngTrường hợphợp thứthứ haihai:: trướctrước khikhi hủyhủy XX tata mócmóc nốinối chacha củacủa XX vớivới concon duyduy nhấtnhất củacủa nónó
44
18 88
13 37 59 108
15 23 55 71
T/h 2: huûy X=37
Caáu truùc Döõ lieäu - Caáu truùc caây 64
1. Tìm w là node trước node x trên phép duyệt cây inorder (chính là node cực phải của cây con bên trái của x)2. Thay x bằng w3. Xóa node w cũ (giống trường hợp 1 hoặc 2 đã xét)
Hủy một phần tử có khóa xHủy một phần tử có khóa xTrường hợp 3: X có đủ 2 conTrường hợp 3: X có đủ 2 con
Caáu truùc Döõ lieäu - Caáu truùc caây 65
Hủy một phần tử có khóa xHủy một phần tử có khóa xTrường hợp 3: X có đủ 2 conTrường hợp 3: X có đủ 2 con
TrườngTrường hợphợp cuốicuối cùngcùng: : KhôngKhông thểthể hủyhủy trựctrực tiếptiếp dodo XX cócó đủđủ 2 2 concon HủyHủy giángián tiếptiếp: :
ThayThay vìvì hủyhủy XX, , tata sẽsẽ tìmtìm mộtmột phầnphần tửtử thếthế mạngmạng YY. . PhầnPhần tửtử nàynày cócó tốitối đađa mộtmột concon. .
ThôngThông tintin lưulưu tạitại YY sẽsẽ đượcđược chuyểnchuyển lênlên lưulưu tạitại XX. . SauSau đóđó, , nútnút bịbị hủyhủy thậtthật sựsự sẽsẽ làlà YY giốnggiống nhưnhư 2 2
trườngtrường hợphợp đầuđầu. .
VấnVấn đềđề: : chọnchọn YY saosao chocho khikhi lưulưu YY vàovào vịvị trítrí củacủa XX, , câycây vẫnvẫn làlà CNPTKCNPTK..
Caáu truùc Döõ lieäu - Caáu truùc caây 66
HủyHủy mộtmột phầnphần tửtử cócó khóakhóa xxTrườngTrường hợphợp 3: 3: XX cócó đủđủ 2 2 concon
VấnVấn đềđề làlà phảiphải chọnchọn YY saosao chocho khikhi lưulưu YY vàovào vịvị trítrí củacủa XX, , câycây vẫnvẫn làlà CNPTKCNPTK..
CóCó 2 2 phầnphần tửtử thỏathỏa mãnmãn yêuyêu cầucầu: : PhầnPhần tửtử nhỏnhỏ nhấtnhất ( (tráitrái nhấtnhất) ) trêntrên câycây concon phảiphải.. PhầnPhần tửtử lớnlớn nhấtnhất ( (phảiphải nhấtnhất) ) trêntrên câycây concon tráitrái..
ViệcViệc chọnchọn lựalựa phầnphần tửtử nàonào làlà phầnphần tửtử thếthế mạngmạng hoànhoàn toàntoàn phụphụ thuộcthuộc vàovào ýý thíchthích củacủa ngườingười lậplập trìnhtrình. .
Ở Ở đâyđây, , tata sẽsẽ chọnchọn phầnphần tửtử phảiphải nhấtnhất trêntrên câycây concon tráitrái làmlàm phânphân tửtử thếthế mạngmạng..
Caáu truùc Döõ lieäu - Caáu truùc caây 67
Hủy một phần tử có khóa xHủy một phần tử có khóa xTrường hợp 3: X có đủ 2 conTrường hợp 3: X có đủ 2 con
Khi hủy phần tử X=18 ra khỏi cây, phần tử 23 là phần tử Khi hủy phần tử X=18 ra khỏi cây, phần tử 23 là phần tử thế mạng:thế mạng:
4444
1818 8888
1313 3737 5959 101088
1515 2323 4040 5555 7171
T/h 3: huûy T/h 3: huûy X=18X=18
3030
Caáu truùc Döõ lieäu - Caáu truùc caây 68
HủyHủy mộtmột phầnphần tửtử cócó khóakhóa xxTrường hợp 3: X có đủ 2 conTrường hợp 3: X có đủ 2 con
HàmHàm delNode trảtrả vềvề giágiá trịtrị 1, 0 1, 0 khikhi hủyhủy thànhthành côngcông hoặchoặc khôngkhông cócó XX trongtrong câycây:: int delNode(TREE &root, Data X)
HàmHàm searchStandFor tìmtìm phầnphần tửtử thếthế mạngmạng chocho nútnút pp void searchStandFor(TREE &p, TREE &q)
Caáu truùc Döõ lieäu - Caáu truùc caây 69
HủyHủy mộtmột phầnphần tửtử cócó khóakhóa xxint delNode(TREE &root, Data X){
if(root== NULL) return 0;if(root->data > X) return delNode(root->left, X);if(root->data < X) return delNode(root->right, X);//T->Key == XNode* p = root;if(root->left == NULL)
root = root->right;else
if(root->right == NULL) root = root->left;
else // T cĩ dủ 2 consearchStandFor(p, root->right);
delete p;}
Caáu truùc Döõ lieäu - Caáu truùc caây 70
HủyHủy mộtmột phầnphần tửtử cócó khóakhóa xx
void searchStandFor(TREE &p, TREE &q)
{
if(q->left)
searchStandFor(p, q->left);
else
{
p->data = q->data;
p = q;
q = q->right;
}
}
Caáu truùc Döõ lieäu - Caáu truùc caây 71
HủyHủy toàntoàn bộbộ câycây nhịnhị phânphân tìmtìm kiếmkiếm
ViệcViệc toàntoàn bộbộ câycây cócó thểthể đượcđược thựcthực hiệnhiện thôngthông quaqua thaothao táctác duyệtduyệt câycây theotheo thứthứ tựtự sausau. . NghĩaNghĩa làlà tata sẽsẽ hủyhủy câycây concon tráitrái, , câycây concon phảiphải rồirồi mớimới hủyhủy nútnút gốcgốc.. void removeTree(TREE &root)
{
if(root) {
removeTree(root->reft);
removeTree(root->right);
delete(root);
}
}
Caáu truùc Döõ lieäu - Caáu truùc caây 72
CâyCây nhịnhị phânphân tìmtìm kiếmkiếmNhậnNhận xétxét::
TấtTất cảcả cáccác thaothao táctác searchNodesearchNode, , insertNodeinsertNode, , delNodedelNode đềuđều cócó độđộ phứcphức tạptạp trungtrung bìnhbình OO((hh), ), vớivới hh làlà chiềuchiều caocao củacủa câycây
TrongTrong trongtrong trườngtrường hợphợp tốttốt nhấtnhất, , CNPTKCNPTK cócó nn nútnút sẽsẽ cócó độđộ caocao hh = = loglog22((nn). ). ChiChi phíphí tìmtìm kiếmkiếm khikhi đóđó sẽsẽ tươngtương đươngđương tìmtìm kiếmkiếm nhịnhị phânphân trêntrên mảngmảng cócó thứthứ tựtự..
TrongTrong trườngtrường hợphợp xấuxấu nhấtnhất, , câycây cócó thểthể bịbị suysuy biếnbiến thànhthành 1 1 danhdanh sáchsách liênliên kếtkết ( (khikhi màmà mỗimỗi nútnút đềuđều chỉchỉ cócó 1 1 concon trừtrừ nútnút lálá). ). LúcLúc đóđó cáccác thaothao táctác trêntrên sẽsẽ cócó độđộ phứcphức tạptạp OO((nn). ).
VìVì vậyvậy cầncần cócó cảicải tiếntiến cấucấu trúctrúc củacủa CNPTKCNPTK đểđể đạtđạt đượcđược chichi phíphí chocho cáccác thaothao táctác làlà loglog22((nn).).