72
TREES TREES (Cấu (Cấu trúc trúc cây) cây)

TREES (Cấu trúc cây)

  • 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

Page 1: TREES        (Cấu trúc cây)

TREESTREES

(Cấu (Cấu trúctrúc cây)cây)

Page 2: TREES        (Cấu trúc 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

Page 3: TREES        (Cấu trúc cây)

CấuCấu trúctrúc câycây

Page 4: TREES        (Cấu trúc câ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..

Page 5: TREES        (Cấu trúc cây)

Caáu truùc Döõ lieäu - Caáu truùc caây 5

CấuCấu trúctrúc câycây

Page 6: TREES        (Cấu trúc cây)

Caáu truùc Döõ lieäu - Caáu truùc caây 6

CấuCấu trúctrúc câycây

Page 7: TREES        (Cấu trúc câ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.

Page 8: TREES        (Cấu trúc cây)

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

Page 9: TREES        (Cấu trúc cây)

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

Page 10: TREES        (Cấu trúc cây)

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

Page 11: TREES        (Cấu trúc cây)

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

Page 12: TREES        (Cấu trúc cây)

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

Page 13: TREES        (Cấu trúc cây)

CâyCây nhịnhị phânphân

Page 14: TREES        (Cấu trúc cây)

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

Page 15: TREES        (Cấu trúc cây)

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

Page 16: TREES        (Cấu trúc cây)

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.

Page 17: TREES        (Cấu trúc cây)

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.

Page 18: TREES        (Cấu trúc cây)

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::

Page 19: TREES        (Cấu trúc cây)

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

Page 20: TREES        (Cấu trúc cây)

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

Page 21: TREES        (Cấu trúc cây)

Caáu truùc Döõ lieäu - Caáu truùc caây 21

CâyCây nhịnhị phânphân

Page 22: TREES        (Cấu trúc cây)

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;

Page 23: TREES        (Cấu trúc cây)

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

Page 24: TREES        (Cấu trúc cây)

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);

}}

Page 25: TREES        (Cấu trúc cây)

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::

Page 26: TREES        (Cấu trúc cây)

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)

Page 27: TREES        (Cấu trúc cây)

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);

}}

Page 28: TREES        (Cấu trúc cây)

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

Page 29: TREES        (Cấu trúc cây)

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

}}

Page 30: TREES        (Cấu trúc cây)

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

Page 31: TREES        (Cấu trúc cây)

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

Page 32: TREES        (Cấu trúc cây)

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

Page 33: TREES        (Cấu trúc cây)

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;

Page 34: TREES        (Cấu trúc cây)

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

Page 35: TREES        (Cấu trúc cây)

CâyCây nhịnhị phânphân tìmtìm kiếmkiếm (Binary search tree)(Binary search tree)

Page 36: TREES        (Cấu trúc cây)

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

Page 37: TREES        (Cấu trúc cây)

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

Page 38: TREES        (Cấu trúc cây)

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;

Page 39: TREES        (Cấu trúc cây)

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;

}}

Page 40: TREES        (Cấu trúc cây)

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);

}}

Page 41: TREES        (Cấu trúc cây)

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

Page 42: TREES        (Cấu trúc cây)

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;

}}

}}

Page 43: TREES        (Cấu trúc cây)

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);

}}

}}

Page 44: TREES        (Cấu trúc cây)

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

Page 45: TREES        (Cấu trúc cây)

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

Page 46: TREES        (Cấu trúc cây)

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);

}}

}}

Page 47: TREES        (Cấu trúc cây)

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);

}}

}}

Page 48: TREES        (Cấu trúc cây)

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<<" ";

}}

}}

Page 49: TREES        (Cấu trúc cây)

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;

}

Page 50: TREES        (Cấu trúc cây)

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;;

}}

Page 51: TREES        (Cấu trúc cây)

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

Page 52: TREES        (Cấu trúc cây)

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

Page 53: TREES        (Cấu trúc câ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) .) .

Page 54: TREES        (Cấu trúc cây)

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

Page 55: TREES        (Cấu trúc cây)

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

Page 56: TREES        (Cấu trúc câ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::

Page 57: TREES        (Cấu trúc cây)

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

}

Page 58: TREES        (Cấu trúc cây)

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

Page 59: TREES        (Cấu trúc cây)

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

Page 60: TREES        (Cấu trúc cây)

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

Page 61: TREES        (Cấu trúc cây)

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

Page 62: TREES        (Cấu trúc cây)

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

Page 63: TREES        (Cấu trúc cây)

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

Page 64: TREES        (Cấu trúc cây)

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

Page 65: TREES        (Cấu trúc cây)

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

Page 66: TREES        (Cấu trúc cây)

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

Page 67: TREES        (Cấu trúc cây)

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

Page 68: TREES        (Cấu trúc cây)

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)

Page 69: TREES        (Cấu trúc cây)

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;}

Page 70: TREES        (Cấu trúc cây)

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;

}

}

Page 71: TREES        (Cấu trúc cây)

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);

}

}

Page 72: TREES        (Cấu trúc cây)

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