127
Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1.De quy 2.Cau truc du lieu CuuDuongThanCong.com https://fb.com/tailieudientucntt

Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Chương 4

Một số cấu truacutec dữ liệu vagrave giải thuật căn bản

1De quy

2Cau truc du lieu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Caacutec bagravei toaacuten thực tế thường phức tạp

bull Hiểu bagravei toaacuten đặt ra == để giải quyết bagravei

toaacuten cần lagravem gigrave khocircng cần lagravem gigrave Do đoacute

phải xaacutec định được

Caacutec dữ liệu liecircn quan đến bagravei toaacuten

Caacutec thao taacutec cần thiết để giải quyết bagravei toaacuten

Mở đầu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cần quản lyacute những

thocircng tin nagraveo

ndash Thocircng tin về nhacircn

viecircn tecircn ngagravey

sinh số bảo hiểm

xatilde hội phograveng ban

lagravem việc hellip

nhacircn viecircn ảo

ndash hellip

bull Cần thực hiện những

thao taacutec quản lyacute nagraveo

ndash Tạo ra hồ sơ cho nhacircn

viecircn mới vagraveo lagravem

ndash Cập nhật một số thocircng

tin trong hồ sơ

ndash Tigravem kiếm thocircng tin về

1 nhacircn viecircn

ndash hellip

bull Ai được pheacutep thực hiện

thao taacutec nagraveo

Viacute dụ Bagravei toaacuten quản lyacute nhacircn viecircn

của một cơ quan

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec dữ liệu lagrave caacutech tổ chức vagrave thao

taacutec coacute hệ thống trecircn dữ liệu

bull 1 cấu truacutec dữ liệu

ndash Mocirc tả

bull Caacutec dữ liệu cấu thagravenh

bull Mối liecircn kết về mặt cấu truacutec giữa caacutec dữ liệu đoacute

ndash Cung cấp caacutec thao taacutec trecircn dữ liệu đoacute

ndash Đặc trưng cho 1 kiểu dữ liệu

1 Caacutec khaacutei niệm cơ bản

Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Kiểu dữ liệu cơ bản (primitive data type)

ndash Đại diện cho caacutec dữ liệu giống nhau khocircng thể phacircn chia nhỏ hơn được nữa

ndash Thường được caacutec ngocircn ngữ lập trigravenh định nghĩa sẵn

ndash Viacute dụ bull CC++ int long

char boolean vv

bull Thao taacutec trecircn caacutec số nguyecircn + -

bull Kiểu dữ liệu coacute cấu

truacutec (structured data

type)

ndash Được xacircy dựng từ caacutec

kiểu dữ liệu (cơ bản

coacute cấu truacutec) khaacutec

ndash Coacute thể được caacutec ngocircn

ngữ lập trigravenh định

nghĩa sẵn hoặc do lập

trigravenh viecircn tự định

nghĩa

1 Caacutec khaacutei niệm cơ bản

Kiểu dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Caacutec khaacutei niệm cơ bản

Dữ liệu kiểu dữ liệu cấu truacutec dữ

liệu

Machine Level Data Storage

Primitive Data Types

Basic Data Structures

High-Level Data Structures

0100110001101001010001

28 31415 A

stack queue list

array

hash table tree

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mang ( bo qua )

bull Danh saacutech

bull Cacircy

bull Bảng băm

II Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Danh saacutech

ndash Tập hợp caacutec phần tử cugraveng kiểu

ndash Số lượng caacutec phần tử của danh saacutech khocircng cố định

bull Phacircn loại

ndash Danh saacutech tuyến tiacutenh

bull Coacute phần tử đầu tiecircn phần tử cuối cugraveng

bull Thứ tự trước sau của caacutec phần tử được xaacutec định rotilde ragraveng viacute dụ sắp theo thứ tự

tăng dần giảm dần hay thứ tự trong bảng chữ caacutei

bull Caacutec thao taacutec trecircn danh saacutech phải khocircng lagravem ảnh hưởng đến trật tự nagravey

ndash Danh saacutech khocircng tuyến tiacutenh caacutec phần tử trong danh saacutech khocircng được sắp

thứ tự

bull Coacute nhiều higravenh thức lưu trữ danh saacutech

ndash Sử dụng vugraveng caacutec ocirc nhớ liecircn tiếp trong bộ nhớ danh saacutech kế tiếp

ndash Sử dụng vugraveng caacutec ocirc nhớ khocircng liecircn tiếp trong bộ nhớ danh saacutech moacutec nối

bull Danh saacutech nối đơn

bull Danh saacutech nối keacutep

1 Danh saacutech (list)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 2: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Caacutec bagravei toaacuten thực tế thường phức tạp

bull Hiểu bagravei toaacuten đặt ra == để giải quyết bagravei

toaacuten cần lagravem gigrave khocircng cần lagravem gigrave Do đoacute

phải xaacutec định được

Caacutec dữ liệu liecircn quan đến bagravei toaacuten

Caacutec thao taacutec cần thiết để giải quyết bagravei toaacuten

Mở đầu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cần quản lyacute những

thocircng tin nagraveo

ndash Thocircng tin về nhacircn

viecircn tecircn ngagravey

sinh số bảo hiểm

xatilde hội phograveng ban

lagravem việc hellip

nhacircn viecircn ảo

ndash hellip

bull Cần thực hiện những

thao taacutec quản lyacute nagraveo

ndash Tạo ra hồ sơ cho nhacircn

viecircn mới vagraveo lagravem

ndash Cập nhật một số thocircng

tin trong hồ sơ

ndash Tigravem kiếm thocircng tin về

1 nhacircn viecircn

ndash hellip

bull Ai được pheacutep thực hiện

thao taacutec nagraveo

Viacute dụ Bagravei toaacuten quản lyacute nhacircn viecircn

của một cơ quan

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec dữ liệu lagrave caacutech tổ chức vagrave thao

taacutec coacute hệ thống trecircn dữ liệu

bull 1 cấu truacutec dữ liệu

ndash Mocirc tả

bull Caacutec dữ liệu cấu thagravenh

bull Mối liecircn kết về mặt cấu truacutec giữa caacutec dữ liệu đoacute

ndash Cung cấp caacutec thao taacutec trecircn dữ liệu đoacute

ndash Đặc trưng cho 1 kiểu dữ liệu

1 Caacutec khaacutei niệm cơ bản

Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Kiểu dữ liệu cơ bản (primitive data type)

ndash Đại diện cho caacutec dữ liệu giống nhau khocircng thể phacircn chia nhỏ hơn được nữa

ndash Thường được caacutec ngocircn ngữ lập trigravenh định nghĩa sẵn

ndash Viacute dụ bull CC++ int long

char boolean vv

bull Thao taacutec trecircn caacutec số nguyecircn + -

bull Kiểu dữ liệu coacute cấu

truacutec (structured data

type)

ndash Được xacircy dựng từ caacutec

kiểu dữ liệu (cơ bản

coacute cấu truacutec) khaacutec

ndash Coacute thể được caacutec ngocircn

ngữ lập trigravenh định

nghĩa sẵn hoặc do lập

trigravenh viecircn tự định

nghĩa

1 Caacutec khaacutei niệm cơ bản

Kiểu dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Caacutec khaacutei niệm cơ bản

Dữ liệu kiểu dữ liệu cấu truacutec dữ

liệu

Machine Level Data Storage

Primitive Data Types

Basic Data Structures

High-Level Data Structures

0100110001101001010001

28 31415 A

stack queue list

array

hash table tree

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mang ( bo qua )

bull Danh saacutech

bull Cacircy

bull Bảng băm

II Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Danh saacutech

ndash Tập hợp caacutec phần tử cugraveng kiểu

ndash Số lượng caacutec phần tử của danh saacutech khocircng cố định

bull Phacircn loại

ndash Danh saacutech tuyến tiacutenh

bull Coacute phần tử đầu tiecircn phần tử cuối cugraveng

bull Thứ tự trước sau của caacutec phần tử được xaacutec định rotilde ragraveng viacute dụ sắp theo thứ tự

tăng dần giảm dần hay thứ tự trong bảng chữ caacutei

bull Caacutec thao taacutec trecircn danh saacutech phải khocircng lagravem ảnh hưởng đến trật tự nagravey

ndash Danh saacutech khocircng tuyến tiacutenh caacutec phần tử trong danh saacutech khocircng được sắp

thứ tự

bull Coacute nhiều higravenh thức lưu trữ danh saacutech

ndash Sử dụng vugraveng caacutec ocirc nhớ liecircn tiếp trong bộ nhớ danh saacutech kế tiếp

ndash Sử dụng vugraveng caacutec ocirc nhớ khocircng liecircn tiếp trong bộ nhớ danh saacutech moacutec nối

bull Danh saacutech nối đơn

bull Danh saacutech nối keacutep

1 Danh saacutech (list)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 3: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Cần quản lyacute những

thocircng tin nagraveo

ndash Thocircng tin về nhacircn

viecircn tecircn ngagravey

sinh số bảo hiểm

xatilde hội phograveng ban

lagravem việc hellip

nhacircn viecircn ảo

ndash hellip

bull Cần thực hiện những

thao taacutec quản lyacute nagraveo

ndash Tạo ra hồ sơ cho nhacircn

viecircn mới vagraveo lagravem

ndash Cập nhật một số thocircng

tin trong hồ sơ

ndash Tigravem kiếm thocircng tin về

1 nhacircn viecircn

ndash hellip

bull Ai được pheacutep thực hiện

thao taacutec nagraveo

Viacute dụ Bagravei toaacuten quản lyacute nhacircn viecircn

của một cơ quan

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec dữ liệu lagrave caacutech tổ chức vagrave thao

taacutec coacute hệ thống trecircn dữ liệu

bull 1 cấu truacutec dữ liệu

ndash Mocirc tả

bull Caacutec dữ liệu cấu thagravenh

bull Mối liecircn kết về mặt cấu truacutec giữa caacutec dữ liệu đoacute

ndash Cung cấp caacutec thao taacutec trecircn dữ liệu đoacute

ndash Đặc trưng cho 1 kiểu dữ liệu

1 Caacutec khaacutei niệm cơ bản

Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Kiểu dữ liệu cơ bản (primitive data type)

ndash Đại diện cho caacutec dữ liệu giống nhau khocircng thể phacircn chia nhỏ hơn được nữa

ndash Thường được caacutec ngocircn ngữ lập trigravenh định nghĩa sẵn

ndash Viacute dụ bull CC++ int long

char boolean vv

bull Thao taacutec trecircn caacutec số nguyecircn + -

bull Kiểu dữ liệu coacute cấu

truacutec (structured data

type)

ndash Được xacircy dựng từ caacutec

kiểu dữ liệu (cơ bản

coacute cấu truacutec) khaacutec

ndash Coacute thể được caacutec ngocircn

ngữ lập trigravenh định

nghĩa sẵn hoặc do lập

trigravenh viecircn tự định

nghĩa

1 Caacutec khaacutei niệm cơ bản

Kiểu dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Caacutec khaacutei niệm cơ bản

Dữ liệu kiểu dữ liệu cấu truacutec dữ

liệu

Machine Level Data Storage

Primitive Data Types

Basic Data Structures

High-Level Data Structures

0100110001101001010001

28 31415 A

stack queue list

array

hash table tree

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mang ( bo qua )

bull Danh saacutech

bull Cacircy

bull Bảng băm

II Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Danh saacutech

ndash Tập hợp caacutec phần tử cugraveng kiểu

ndash Số lượng caacutec phần tử của danh saacutech khocircng cố định

bull Phacircn loại

ndash Danh saacutech tuyến tiacutenh

bull Coacute phần tử đầu tiecircn phần tử cuối cugraveng

bull Thứ tự trước sau của caacutec phần tử được xaacutec định rotilde ragraveng viacute dụ sắp theo thứ tự

tăng dần giảm dần hay thứ tự trong bảng chữ caacutei

bull Caacutec thao taacutec trecircn danh saacutech phải khocircng lagravem ảnh hưởng đến trật tự nagravey

ndash Danh saacutech khocircng tuyến tiacutenh caacutec phần tử trong danh saacutech khocircng được sắp

thứ tự

bull Coacute nhiều higravenh thức lưu trữ danh saacutech

ndash Sử dụng vugraveng caacutec ocirc nhớ liecircn tiếp trong bộ nhớ danh saacutech kế tiếp

ndash Sử dụng vugraveng caacutec ocirc nhớ khocircng liecircn tiếp trong bộ nhớ danh saacutech moacutec nối

bull Danh saacutech nối đơn

bull Danh saacutech nối keacutep

1 Danh saacutech (list)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 4: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Cấu truacutec dữ liệu lagrave caacutech tổ chức vagrave thao

taacutec coacute hệ thống trecircn dữ liệu

bull 1 cấu truacutec dữ liệu

ndash Mocirc tả

bull Caacutec dữ liệu cấu thagravenh

bull Mối liecircn kết về mặt cấu truacutec giữa caacutec dữ liệu đoacute

ndash Cung cấp caacutec thao taacutec trecircn dữ liệu đoacute

ndash Đặc trưng cho 1 kiểu dữ liệu

1 Caacutec khaacutei niệm cơ bản

Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Kiểu dữ liệu cơ bản (primitive data type)

ndash Đại diện cho caacutec dữ liệu giống nhau khocircng thể phacircn chia nhỏ hơn được nữa

ndash Thường được caacutec ngocircn ngữ lập trigravenh định nghĩa sẵn

ndash Viacute dụ bull CC++ int long

char boolean vv

bull Thao taacutec trecircn caacutec số nguyecircn + -

bull Kiểu dữ liệu coacute cấu

truacutec (structured data

type)

ndash Được xacircy dựng từ caacutec

kiểu dữ liệu (cơ bản

coacute cấu truacutec) khaacutec

ndash Coacute thể được caacutec ngocircn

ngữ lập trigravenh định

nghĩa sẵn hoặc do lập

trigravenh viecircn tự định

nghĩa

1 Caacutec khaacutei niệm cơ bản

Kiểu dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Caacutec khaacutei niệm cơ bản

Dữ liệu kiểu dữ liệu cấu truacutec dữ

liệu

Machine Level Data Storage

Primitive Data Types

Basic Data Structures

High-Level Data Structures

0100110001101001010001

28 31415 A

stack queue list

array

hash table tree

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mang ( bo qua )

bull Danh saacutech

bull Cacircy

bull Bảng băm

II Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Danh saacutech

ndash Tập hợp caacutec phần tử cugraveng kiểu

ndash Số lượng caacutec phần tử của danh saacutech khocircng cố định

bull Phacircn loại

ndash Danh saacutech tuyến tiacutenh

bull Coacute phần tử đầu tiecircn phần tử cuối cugraveng

bull Thứ tự trước sau của caacutec phần tử được xaacutec định rotilde ragraveng viacute dụ sắp theo thứ tự

tăng dần giảm dần hay thứ tự trong bảng chữ caacutei

bull Caacutec thao taacutec trecircn danh saacutech phải khocircng lagravem ảnh hưởng đến trật tự nagravey

ndash Danh saacutech khocircng tuyến tiacutenh caacutec phần tử trong danh saacutech khocircng được sắp

thứ tự

bull Coacute nhiều higravenh thức lưu trữ danh saacutech

ndash Sử dụng vugraveng caacutec ocirc nhớ liecircn tiếp trong bộ nhớ danh saacutech kế tiếp

ndash Sử dụng vugraveng caacutec ocirc nhớ khocircng liecircn tiếp trong bộ nhớ danh saacutech moacutec nối

bull Danh saacutech nối đơn

bull Danh saacutech nối keacutep

1 Danh saacutech (list)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 5: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Kiểu dữ liệu cơ bản (primitive data type)

ndash Đại diện cho caacutec dữ liệu giống nhau khocircng thể phacircn chia nhỏ hơn được nữa

ndash Thường được caacutec ngocircn ngữ lập trigravenh định nghĩa sẵn

ndash Viacute dụ bull CC++ int long

char boolean vv

bull Thao taacutec trecircn caacutec số nguyecircn + -

bull Kiểu dữ liệu coacute cấu

truacutec (structured data

type)

ndash Được xacircy dựng từ caacutec

kiểu dữ liệu (cơ bản

coacute cấu truacutec) khaacutec

ndash Coacute thể được caacutec ngocircn

ngữ lập trigravenh định

nghĩa sẵn hoặc do lập

trigravenh viecircn tự định

nghĩa

1 Caacutec khaacutei niệm cơ bản

Kiểu dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Caacutec khaacutei niệm cơ bản

Dữ liệu kiểu dữ liệu cấu truacutec dữ

liệu

Machine Level Data Storage

Primitive Data Types

Basic Data Structures

High-Level Data Structures

0100110001101001010001

28 31415 A

stack queue list

array

hash table tree

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mang ( bo qua )

bull Danh saacutech

bull Cacircy

bull Bảng băm

II Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Danh saacutech

ndash Tập hợp caacutec phần tử cugraveng kiểu

ndash Số lượng caacutec phần tử của danh saacutech khocircng cố định

bull Phacircn loại

ndash Danh saacutech tuyến tiacutenh

bull Coacute phần tử đầu tiecircn phần tử cuối cugraveng

bull Thứ tự trước sau của caacutec phần tử được xaacutec định rotilde ragraveng viacute dụ sắp theo thứ tự

tăng dần giảm dần hay thứ tự trong bảng chữ caacutei

bull Caacutec thao taacutec trecircn danh saacutech phải khocircng lagravem ảnh hưởng đến trật tự nagravey

ndash Danh saacutech khocircng tuyến tiacutenh caacutec phần tử trong danh saacutech khocircng được sắp

thứ tự

bull Coacute nhiều higravenh thức lưu trữ danh saacutech

ndash Sử dụng vugraveng caacutec ocirc nhớ liecircn tiếp trong bộ nhớ danh saacutech kế tiếp

ndash Sử dụng vugraveng caacutec ocirc nhớ khocircng liecircn tiếp trong bộ nhớ danh saacutech moacutec nối

bull Danh saacutech nối đơn

bull Danh saacutech nối keacutep

1 Danh saacutech (list)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 6: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

1 Caacutec khaacutei niệm cơ bản

Dữ liệu kiểu dữ liệu cấu truacutec dữ

liệu

Machine Level Data Storage

Primitive Data Types

Basic Data Structures

High-Level Data Structures

0100110001101001010001

28 31415 A

stack queue list

array

hash table tree

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mang ( bo qua )

bull Danh saacutech

bull Cacircy

bull Bảng băm

II Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Danh saacutech

ndash Tập hợp caacutec phần tử cugraveng kiểu

ndash Số lượng caacutec phần tử của danh saacutech khocircng cố định

bull Phacircn loại

ndash Danh saacutech tuyến tiacutenh

bull Coacute phần tử đầu tiecircn phần tử cuối cugraveng

bull Thứ tự trước sau của caacutec phần tử được xaacutec định rotilde ragraveng viacute dụ sắp theo thứ tự

tăng dần giảm dần hay thứ tự trong bảng chữ caacutei

bull Caacutec thao taacutec trecircn danh saacutech phải khocircng lagravem ảnh hưởng đến trật tự nagravey

ndash Danh saacutech khocircng tuyến tiacutenh caacutec phần tử trong danh saacutech khocircng được sắp

thứ tự

bull Coacute nhiều higravenh thức lưu trữ danh saacutech

ndash Sử dụng vugraveng caacutec ocirc nhớ liecircn tiếp trong bộ nhớ danh saacutech kế tiếp

ndash Sử dụng vugraveng caacutec ocirc nhớ khocircng liecircn tiếp trong bộ nhớ danh saacutech moacutec nối

bull Danh saacutech nối đơn

bull Danh saacutech nối keacutep

1 Danh saacutech (list)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 7: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Mang ( bo qua )

bull Danh saacutech

bull Cacircy

bull Bảng băm

II Cấu truacutec dữ liệu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Danh saacutech

ndash Tập hợp caacutec phần tử cugraveng kiểu

ndash Số lượng caacutec phần tử của danh saacutech khocircng cố định

bull Phacircn loại

ndash Danh saacutech tuyến tiacutenh

bull Coacute phần tử đầu tiecircn phần tử cuối cugraveng

bull Thứ tự trước sau của caacutec phần tử được xaacutec định rotilde ragraveng viacute dụ sắp theo thứ tự

tăng dần giảm dần hay thứ tự trong bảng chữ caacutei

bull Caacutec thao taacutec trecircn danh saacutech phải khocircng lagravem ảnh hưởng đến trật tự nagravey

ndash Danh saacutech khocircng tuyến tiacutenh caacutec phần tử trong danh saacutech khocircng được sắp

thứ tự

bull Coacute nhiều higravenh thức lưu trữ danh saacutech

ndash Sử dụng vugraveng caacutec ocirc nhớ liecircn tiếp trong bộ nhớ danh saacutech kế tiếp

ndash Sử dụng vugraveng caacutec ocirc nhớ khocircng liecircn tiếp trong bộ nhớ danh saacutech moacutec nối

bull Danh saacutech nối đơn

bull Danh saacutech nối keacutep

1 Danh saacutech (list)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 8: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Danh saacutech

ndash Tập hợp caacutec phần tử cugraveng kiểu

ndash Số lượng caacutec phần tử của danh saacutech khocircng cố định

bull Phacircn loại

ndash Danh saacutech tuyến tiacutenh

bull Coacute phần tử đầu tiecircn phần tử cuối cugraveng

bull Thứ tự trước sau của caacutec phần tử được xaacutec định rotilde ragraveng viacute dụ sắp theo thứ tự

tăng dần giảm dần hay thứ tự trong bảng chữ caacutei

bull Caacutec thao taacutec trecircn danh saacutech phải khocircng lagravem ảnh hưởng đến trật tự nagravey

ndash Danh saacutech khocircng tuyến tiacutenh caacutec phần tử trong danh saacutech khocircng được sắp

thứ tự

bull Coacute nhiều higravenh thức lưu trữ danh saacutech

ndash Sử dụng vugraveng caacutec ocirc nhớ liecircn tiếp trong bộ nhớ danh saacutech kế tiếp

ndash Sử dụng vugraveng caacutec ocirc nhớ khocircng liecircn tiếp trong bộ nhớ danh saacutech moacutec nối

bull Danh saacutech nối đơn

bull Danh saacutech nối keacutep

1 Danh saacutech (list)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 9: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Thao taacutec trecircn danh saacutech tuyến tiacutenh

ndash Khởi tạo danh saacutech (create)

ndash Kiểm tra danh saacutech rỗng (isEmpty)

ndash Kiểm tra danh saacutech đầy (isFull)

ndash Tiacutenh kiacutech thước (sizeOf)

ndash Xoacutea rỗng danh saacutech (clear)

ndash Thecircm một phần tử vagraveo danh saacutech tại một viacute triacute cụ thể (insert)

ndash Loại bỏ một phần tử tại một vị triacute cụ thể khỏi danh saacutech (remove)

ndash Lấy một phần tử tại một vị triacute cụ thể (retrieve)

ndash Thay thế giaacute trị của một phần tử tại một vị triacute cụ thể (replace)

ndash Duyệt danh saacutech vagrave thực hiện một thao taacutec tại caacutec vị triacute trong danh

saacutech (traverse)

1 Danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 10: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Sử dụng một vector lưu trữ gồm một số

caacutec ocirc nhớ liecircn tiếp để lưu trữ một danh

saacutech tuyến tiacutenh

ndash Caacutec phần tử liền kề nhau được lưu trữ trong

những ocirc nhớ liền kề nhau

ndash Mỗi phần tử của danh saacutech cũng được gaacuten

một chỉ số chỉ thứ tự được lưu trữ trong

vector

ndash Tham chiếu đến caacutec phần tử sử dụng địa chỉ

được tiacutenh giống như lưu trữ mảng

11 Danh saacutech kế tiếp

0 1 2 i last n-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 11: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Ưu điểm của caacutech lưu trữ kế tiếp

ndash Tốc độ truy cập vagraveo caacutec phần tử của danh saacutech

nhanh

bull Nhược điểm của caacutech lưu trữ kế tiếp

ndash Cần phải biết trước kiacutech thước tối đa của danh saacutech

bull Tại sao

ndash Thực hiện caacutec pheacutep toaacuten bổ sung caacutec phần tử mới vagrave

loại bỏ caacutec phần tử cũ khaacute tốn keacutem

bull Tại sao

11 Danh saacutech kế tiếp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 12: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull 2 trường hợp

ndash insert(index element) thecircm một phần tử element vagraveo một vị triacute cụ thể index

ndash insert(list element) thecircm một phần tử element vagraveo vị triacute bất kỳ trong danh saacutech

list

bull Điều kiện tiecircn quyết

ndash Danh saacutech phải được khởi tạo rồi

ndash Danh saacutech chưa đầy

ndash Phần tử thecircm vagraveo chưa coacute trong danh saacutech

bull Điều kiện hậu nghiệm

ndash Phần tử cần thecircm vagraveo coacute trong danh saacutech

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếp

insert(3 bdquoz‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g hz

count=8count=9CuuDuongThanCongcom httpsfbcomtailieudientucntt

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 13: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

11a Thecircm một phần tử vagraveo một

danh saacutech kế tiếpAlgorithm Insert

Input index lagrave vị triacute cần thecircm vagraveo element lagrave giaacute trị cần thecircm vagraveo

Output tigravenh trạng danh saacutech

if list đầy

return overflow

if index nằm ngoagravei khoảng [0count]

return range_error

Dời tất cả caacutec phần tử từ index về sau 1 vị triacute

for i = count-1 down to index

entry[i+1] = entry[i]

entry[index] = element Gaacuten element vagraveo vị triacute index

count++ Tăng số phần tử lecircn 1

return success

End Insert

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 14: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

11bXoacutea 1 phần tử khỏi danh

saacutech kế tiếpremove(3 bdquod‟)

da b c

0 1 2 3 4 5 6 7 8 9

e f g hd e f g h

count=8count=7

h

CuuDuongThanCongcom httpsfbcomtailieudientucntt

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 15: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

11bXoacutea 1 phần tử khỏi danh saacutech

kế tiếpAlgorithm Remove

Input index lagrave vị triacute cần xoacutea bỏ element lagrave giaacute trị lấy ra được

Output danh saacutech đatilde xoacutea bỏ phần tử tại index

if list rỗng

return underflow

if index nằm ngoagravei khoảng [0count-1]

return range_error

element = entry[index] Lấy element tại vị triacute index ra

count-- Giảm số phần tử đi 1

Dời tất cả caacutec phần tử từ index về trước 1 vị triacute

for i = index to count-1

entry[i] = entry[i+1]

return success

End Remove

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 16: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

1cDuyệt danh saacutech kế tiếp

Algorithm Traverse

Input hagravem visit dugraveng để taacutec động vagraveo từng phần tử

Output danh saacutech được cập nhật bằng hagravem visit

Queacutet qua tất cả caacutec phần tử trong list

for index = 0 to count-1

Thi hagravenh hagravem visit để duyệt phần tử entry[index]

End Traverse

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 17: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Một phần tử trong danh saacutech = một nuacutet

bull Quy caacutech của một nuacutetndash INFO chứa thocircng tin

(nội dung giaacute trị) ứng với phần tử

ndash NEXT chứa địa chỉ của nuacutet tiếp theo

bull Để thao taacutec được trecircn danh saacutech cần nắm được địa chỉ của nuacutet đầu tiecircn trong danh saacutech tức lagrave biết được con trỏ L trỏ tới đầu danh saacutech

12 Danh saacutech nối đơn

L INFO N

E

X

T

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 18: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Tổ chức danh saacutech moacutec nốibull Nuacutet = dữ liệu + moacutec nối1048699

bull Định nghĩa

typedef struct node

int data

struct node next Node

bull Tạo nuacutet mới

Node p = malloc(sizeof(Node))1048699

bull Giải phoacuteng nuacutet

free(p)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 19: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Khởi tạo vagrave truy cập danh saacutech

moacutec nốibull Khai baacuteo một con trỏ

Node Head

Head lagrave con trỏ trỏ đến nuacutet đầu của danh saacutechKhi danh saacutech rỗng thigrave Head =NULL

bull Tham chiếu đến caacutec thagravenh phần của một nuacutet trỏ bởi pndash INFO(p)

ndash NEXT(p)

bull Một số thao taacutec với danh saacutech nối đơnndash 1Thecircm một nuacutet mới tại vị triacute cụ thể

ndash 2Tigravem nuacutet coacute giaacute trị cho trước

ndash 3Xoacutea một nuacutet coacute giaacute trị cho trước

ndash 4Gheacutep 2 danh saacutech nối đơn

ndash 5Hủy danh saacutech nối đơn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 20: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Truyền danh saacutech moacutec nối vagraveo hagravem

bull 1048699 Khi truyền danh saacutech moacutec nối vagraveo

hagravem chỉ cần truyền Head

bull 1048699 Sử dụng Head để truy cập toagraven bộ

danh saacutech

ndash 1048699 Note nếu hagravem thay đổi vị triacute nuacutet đầu của

danh saacutech (thecircm hoặc xoacutea nuacutet đầu) thigrave Head

sẽ khocircng cograven trỏ đến đầu danh saacutech

ndash 1048699 Do đoacute necircn truyền Head theo tham biến

(hoặc trả lại một con trỏ mới)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 21: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Thecircm một nuacutet mới

bull Caacutec trường hợp của thecircm nuacutet

1Thecircm vagraveo danh saacutech rỗng

2Thecircm vagraveo đầu danh saacutech

3Thecircm vagraveo cuối danh saacutech

4Thecircm vagraveo giữa danh saacutech

bull 1048699 Thực tế chỉ cần xeacutet 2 trường hợp

ndash Thecircm vagraveo đầu danh saacutech(TH1 vagraveTH2)

ndash Thecircm vagraveo giữa hoặc cuối danh saacutech(TH3 vagrave TH4 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 22: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Thecircm vagraveo danh saacutech rỗng

bull Head = NULL

Node newNode

newNode= malloc(sizeof(Node))

newNode-gtdata = 20

newNode-gtnext = NULL

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 23: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Thecircm một nuacutet vagraveo đầu danh saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = Head

Head = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 24: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Thecircm một nuacutet vagraveo giữacuối danh

saacutech

newNode= malloc(sizeof(Node))

newNode-gtdata = 13

newNode-gtnext = currNode-gtnext

currNode-gtnext= newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 25: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Thecircm một nuacutet mới1048699 Node InsertNode(Node head int index int x)

bull Thecircm một nuacutet mới với dữ liệu lagrave x vagraveo sau nuacutet thứ index(viacutedụkhi index = 0 nuacutet được thecircm lagrave phần tử đầu danh saacutechkhi index =

1 chegraven nuacutet mới vagraveo sau nuacutet đầu tiecircnvv)

bull Nếu thao taacutec thecircm thagravenh cocircngtrả lại nuacutet được thecircm

Ngược lạitrảlạiNULL bull (Nếu index lt 0 hoặc gt độ dagravei của danh saacutechkhocircng thecircm được)

1048699 Giải thuật

1Tigravem nuacutet thứ index ndashcurrNode

2Tạo nuacutet mới

3Moacutec nối nuacutet mới vagraveo danh saacutech

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 26: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Thecircm một nuacutet mới Node InsertNode(Node headint indexint x)

if (index lt 0) return NULL

int currIndex = 1

Node currNode = head

while(currNode ampamp index gt currIndex)

currNode = currNode-gtnext

currIndex++

if (index gt 0 ampamp currNode== NULL) return NULL

Node newNode = (Node ) malloc(sizeof(Node))

newNode-gtdata = x

if (index == 0)

newNode-gtnext = head

head = newNode

else

newNode-gtnext = currNode-gtnext

currNode-gtnext = newNode

return newNode

Tigravem nuacutet thứ index nếu

Khocircng tigravem được trả về

NULL

Tạo nuacutet mới

Thecircm vagraveo đầu ds

Thecircm vagraveo sau currNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 27: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Tigravem nuacutet1048698 int FindNode(intx)

bull 1048699 Tigravem nuacutet coacute giaacute trị x trong danh saacutech

bull 1048699 Nếu tigravem được trả lại vị triacute của nuacutetNếu khocircng trả lại 0

Int FindNode(Node headint x)

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

currNode = currNode-gtnext

currIndex++

if (currNode) return currIndex

else return 0

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 28: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Xoacutea nuacutet

1048699 int DeleteNode(int x)

bull 1048699 Xoacutea nuacutet coacute giaacute trị bằng x trong danh saacutech

bull 1048699 Nếu tigravem thấy nuacutet trả lại vị triacutecủa noacute

Nếu khocircng trả lại 0

bull 1048699 Giải thuậtndash Tigravem nuacutet coacute giaacute trị x (tương tự như FindNode)

ndash Thiết lập nuacutet trước của nuacutet cần xoacutea nối đến nuacutet sau của nuacutet cần xoacutea

ndash Giải phoacuteng bộ nhớ cấp phaacutet cho nuacutet cần xoacutea

ndash Giống như InsertNode coacute 2 trường hợpbull Nuacutet cần xoacutea lagrave nuacutet đầu tiecircn của danh saacutech

bull Nuacutet cần xoacutea nằm ở giữa hoặc cuối danh saacutech

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 29: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Int DeleteNode(Node head int x)

Node prevNode = NULL

Node currNode = head

int currIndex = 1

while (currNode ampamp currNode-gtdata = x)

prevNode = currNode

currNode = currNode-gtnext

currIndex++

if (currNode)

if (prevNode)

prevNode-gtnext = currNode-gtnext

free (currNode)

else

head = currNode-gtnext

free (currNode)

return currIndex

return 0

Tigravem nuacutet coacute giaacute trị = x

Xoacutea nuacutet ở giữa

Xoacutea nuacutet head

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 30: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Hủy danh saacutech

1048699 void DestroyList(Node head)

bull 1048699 Dugraveng để giải phoacuteng bộ nhớ được cấp phaacutet cho danh saacutech

bull 1048699 Duyệt toagraven bộ danh saacutech vagrave xoacutea lần lượt từng nuacutet

Void DestroyList(Node head)

Node currNode = head nextNode= NULL

while(currNode = NULL)

nextNode = currNode-gtnext

free(currNode) giải phoacuteng nuacutet vừa duyệt

currNode = nextNode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 31: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

So saacutenh mảng vagrave danh saacutech liecircn kết

bull 1048699 Việc lập trigravenh vagrave quản lyacute danh saacutech liecircn kết khoacute hơn mảng nhưng noacute coacute những ưu điểm

bull 1048699 Linh độngdanh saacutech liecircn kết coacute kiacutech thước tăng hoặc giảm rất linh độngndash 1048699 Khocircng cần biết trước coacute bao nhiecircu nuacutet trong danh

saacutechTạo nuacutet mới khi cần

ndash 1048699 Ngược lạikiacutech thước của mảng lagrave cố định tại thời gian biecircn dịch chương trigravenh

bull 1048699 Thao taacutec thecircm vagrave xoacutea dễ dagravengndash 1048699 Để thecircm vagrave xoacutea một phần tử mảng cần phải copy

dịch chuyển phần tử

ndash 1048699 Với danh saacutech moacutec nối khocircng cần dịch chuyển magrave chỉ cần thay đổi caacutec moacutec nối

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 32: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Danh saacutech nối keacutep1048699 Mỗi nuacutet khocircng chỉ nối đến nuacutet tiếp theo magrave cograven

nối đến nuacutet trước noacute

bull 1048699 Coacute 2 mối nối NULL tại nuacutet đầu vagrave nuacutet cuối

của danh saacutech

bull 1048699 Ưu điểmtại một nuacutet coacute thể thăm nuacutet trước noacute

một caacutech dễ dagraveng Cho pheacutep duyệt danh saacutech

theo chiều ngược lại

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 33: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Mỗi nuacutet coacute 2 mối nốindash prev nối đến phần tử trước

ndash next nối đến phần tử sau

typedef struct Node

Int data

structNode next

structNode prev

NodeCuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 34: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Thecircm nuacutet New nằm ngay trước Cur (khocircng phải nuacutet đầu hoặc cuối danh saacutech)

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

bull Xoacutea nuacutet Cur(khocircng phải nuacutet đầu hoặc cuối danh saacutech)(Cur-gtprev)-gtnext = Cur-gtnext

(Cur-gtnext)-gtprev = Cur-gtprev

free (Cur)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 35: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Danh saacutech nối keacutep với nuacutet đầu giả

bull Danh saacutech khocircng

rỗng

bull Danh saacutech rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 36: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Tạo danh saacutech nối keacutep rỗng

Node Head = malloc (sizeof(Node))

Head-gtnext = Head

Head-gtprev = Head

bull Khi thecircm hoặc xoacutea caacutec nuacutet tại đầu ds giữa hay

cuối ds

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 37: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

void deleteNode(Node Head int x)

Node Cur

Cur = FindNode(Head x)

if (Cur = NULL)

Cur-gtprev-gtnext = Cur-gtnext

Cur-gtnext-gtprev= Cur-gtprev

free(Cur)

Xoacutea nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 38: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Thecircm nuacutet

void insertNode(Node Head int item)

Node New Cur

New = malloc(sizeof(Node))

New-gtdata = item

Cur = Head-gtnext

while (Cur = Head)

if (Cur-gtdata lt item)

Cur = Cur-gtnext

else

break

New-gtnext = Cur

New-gtprev= Cur-gtprev

Cur-gtprev= New

(New-gtprev)-gtnext = New

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 39: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Bagravei tập

Sử dụng danh saacutech moacutec nối keacutep với nuacutet đầu giả xacircy dựng bagravei toaacuten quản lyacute điểm SV đơn giản với caacutec chức năng sau

1 Nhập dữ liệu vagraveo ds

2 Hiện thị dữ liệu 1 lớp theo thứ tự họ vagrave tecircn

3 Sắp xếp dữ liệu

4 Tigravem kiếm kết quả

Với thocircng tin về mỗi sv đc định nghĩa trong cấu truacutec sau

typedef struct

int masv matilde hiệu sv

char malop[12]

char hovaten[30]

float diemk1

float diemk2

sinhvienCuuDuongThanCongcom httpsfbcomtailieudientucntt

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 40: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

13 Ngăn xếp vagrave hagraveng đợi

bull 1Định nghĩa Stack

bull 2Lưu trữ kế tiếp với Stack (sử dụng mảng)

bull 3Ứng dụng của Stack

bull 4Định nghĩa Queue

bull 5Lưu trữ kế tiếp với Queue (sử dụng mảng)

bull 6Ứng dụng của Queue

bull 7Lưu trữ moacutec nối với Stack

bull 8Lưu trữ moacutec nối với Queue (bagravei tập)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 41: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

1 Định nghĩa Stack

bull 1048699 Hai danh saacutech tuyến tiacutenh đặcbiệt

ndash Ngăn xếp ndashStack

ndash Hagraveng đợi ndashQueue

bull Stacklagrave danh saacutech magrave xoacutea vagrave thecircm phần

tử bắt buộc phải cugraveng được thực hiện tại

một đầu duy nhất (đỉnh)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 42: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Viacute dụ ve Stack trong thực tế

Stack lagrave một cấu truacutec LIFO Last In First OutCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 43: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Caacutec thao taacutec cơ bản trecircn Stack

bull 1048699 Push

ndash 1048699 Thecircm một phần tử

Tragraven (overflow)

bull 1048699 Pop

ndash 1048699 Xoacutea một phần tử

Underflow

bull 1048699 Top

ndash 1048699 Phần tử đỉnh

stack rỗng

bull 1048699 Kiểm tra rỗngđầy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 44: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Lưu trữ Stack

2 caacutech lưu trữ

ndash 1048699 Lưu trữ kế tiếp sử dụng mảng

ndash 1048699 Lưu trữ moacutec nối sử dụng danh saacutech moacutec nối (sau)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 45: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cấu truacutec dữ liệu

Stack của caacutec số nguyecircn intstack

typedef struct intstack

Int stackArr mảng lưu trữ caacutec phần tử

Int count số ptử hiện coacute của stack

Int stackMax giới hạn Max của số ptử

Int top chỉ số của phần tử đỉnh

IntStack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 46: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Tạo StackIntStack CreateStack(int max)

IntStack stack

stack =(IntStack ) malloc(sizeof(IntStack))

if (stack == NULL)

return NULL

Khởi tạo stack rỗng

stack-gttop = -1

stack-gtcount = 0

stack-gtstackMax= max

stack-gtstackArr=malloc(max sizeof(int))

return stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 47: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Push

Int PushStack(IntStack stack int dataIn)

Kiểm tra tragraven

if(stack-gtcount == stack-gtstackMax)

Return 0

Thecircm phần tử vagraveo stack

(stack-gtcount)++

(stack-gttop)++ Tăng đỉnh

stack-gtstackArr[stack-gttop] =dataIn

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 48: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

PopInt PopStack(IntStack stack int dataOut)

Kiểm tra stack rỗng

if(stack-gtcount == 0)

return 0

Lấy giaacute trị phần tử bị loại

dataOut=stack-gtstackArr[stack-gttop]

(stack-gtcount)--

(stack-gttop)-- Giảm đỉnh

Return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 49: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Top

Int TopStack(IntStack stack int dataOut)

if(stack-gtcount ==0) Stack rỗng

return 0

dataOut = stack-gtstackArr[stack-gttop]

return 1

Kiểm tra rỗng

Int IsEmptyStack(IntStack stack)

return(stack-gtcount == 0)

Kiểm tra đầy

intIsFullStack(IntStackstack)

return(stack-gtcount==stack-gtstackMax)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 50: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Ứng dụng của Stack

1048699 Bagravei toaacuten đổi cơ sốChuyển một số từ hệ

thập phacircn sang hệ cơ số bất kỳ

bull (base 8) 2810 = 3bull81+ 4bull80=348

bull (base 4) 7210 = 1bull43+ 0bull42+ 2bull41+ 0bull40=

10204

bull (base 2) 5310 = 1 bull25+ 1 bull24+ 0 bull23+ 1 bull22+

0 bull21+ 1 bull20= 1101012

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 51: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Đầu vagraveo số thập phacircn n cơ số b

Đầu ra số hệ cơ số b tương đương

1Chữ số becircn phải nhất của kết quả=n b Đẩy vagraveo Stack

2Thay n= n b (để tigravem caacutec số tiếp theo)

3Lặp lại bước1-2 cho đến khi n = 0

4Ruacutet lần lượt caacutec chữ số lưu trong Stack chuyển sang dạng

kyacute tự tương ứng với hệ cơ số trước khi in ra kết quả

Viacute dụ Đổi 3553 sang cơ số 8

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 52: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Chuyển sang dạng kyacute tự tương ứng

Char digitChar= ldquo0123456789ABCDEFrdquo

char d = digitChar[13] 1310= D16

char f = digitChar[15] 1310= F16

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 53: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Đổi cơ số

void DoiCoSo(int nint b) chardigitChar= 0123456789ABCDEFldquo

Tạo một stack lưu trữ kết quả

IntStack stack = CreateStack(MAX)

doTiacutenh chữ số becircn phải nhấtđẩy vagraveo stack

PushStack(stack n b)n= b Thay n = nb để tiacutenh tiếp

while(n= 0) Lặp đến khi n = 0

while( IsEmptyStack(stack) )

Ruacutet lần lượt từng phần tửcủa stack

PopStack(stack ampn) chuyển sang dạng kyacute tự vagrave in kết quả

printf(ldquocrdquo digitChar[n])

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 54: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Ứng dụng của Stack (tiếp)

Caacutec biểu thức số học được biểu diễn bằng kyacute

phaacutep trung tố Với pheacutep toaacuten 2 ngocirci Mỗi toaacuten tử

được đặt giữa hai toaacuten hạng Với pheacutep toaacuten một

ngocirci Toaacuten tử được đặt trước toaacuten hạng vd

-2 + 3 5 lt=gt (-2) + (3 5)

bull Thứ tự ưu tiecircn của caacutec pheacutep tử

() gt ^ gt = = gt + = ndash

bull Việc đaacutenh giaacute biểu thức trung tố khaacute phức tạp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 55: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Kyacute phaacutep hậu tố

Lagrave giải phaacutep thay thế kyacute phaacutep trung tố trong đoacute Toaacuten

hạng đặt trước toaacuten tử Khocircng cần dugraveng caacutec dấu ()

Viacute dụ

abcdef =gt abcdef

1 + (-5) (6 (7+8)) =gt 1 5 -6 7 8 + +

(xyndashab) ((b+x) ndashy ) =gt x y a b ndashb x + y y ^ ndash

(xyz ndashx^2 (y2 ndashz^3) + 1z) (x ndashy) =gt

xyzx2^y2z3^ ndash ndash1z+xy ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 56: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Tiacutenh giaacute trị biểu thức hậu tố

Biểu thức trung tố (7 ndash11) 2 + 3

Biểu thức hậu tố 7 11 ndash 2 3 +

7 7

11

- 4 - 4

2

-8

3

-5

-

-8

+

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 57: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Tiacutenh giaacute trị của biểu thức hậu tố

bull Tiacutenh giaacute trị của một một biểu thức hậu tố

được lưu trong một xacircu kyacute tự vagrave trả về giaacute

trị kết quả

bull Với

- Toaacuten hạng Lagrave caacutec số nguyecircn khocircng acircm một

chữ số (cho đơn giản )

- Toaacuten tử + - ^

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 58: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Bool isOperator(char op)

return op == +bdquo || op == - ||

op == bdquo || op == bdquo ||

op == bdquo || op == ^bdquo

Int compute(int left int right char op)

int value

switch(op)

case +bdquo value = left + right break

case -bdquo value = left - right break

case bdquo value = left right break

case value = left right break

case bdquo value = left right break

case ^bdquo value = pow(left right)

return value

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 59: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Int TinhBtHauTo(string Bt)

Int left right kq

char ch

IntStack stack = CreateStack(MAX)

for(int i=0 i lt Btlength() i++)

ch = Bt[i]

if ( isdigit(ch) )

PushStack(stack ch-0) đẩy toaacuten hạng vagraveo stack

else if (isOperator(ch))

ruacutet stack 2 lần để lấy 2 toaacuten hạng left vagrave right

PopStack(stack ampright)

PopStack(stack ampleft)

kq =compute(left right ch) Tiacutenh leftop right

PushStack(stack kq) Đẩy kq vagraveo stack

else khocircng phải toaacuten hạng hoặc toaacuten tử

printf(ldquoBieu thuc loirdquo)

Kết thuacutec tiacutenh toaacuten giaacute trị biểu thức nằm trecircn đỉnh stack đưa vagraveo kq

PopStack(stack kq)

Return kq

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 60: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Bagravei tập

bull Sửa Chương trigravenh trecircn để tiacutenh toaacuten kết quả của 1 bt hậu tố với caacutec toaacuten hạng tổng quaacutet ( coacute thể lagrave số thực coacute thể acircm hellip)

bull Xacircy dựng chương trigravenh chuyển đổi 1 biểu thức từ trung tố sang hậu tố biểu thức trung tố lagrave 1 xacircu kyacute tự với caacutec toaacuten hạng tổng quaacutet vagrave caacutec pheacutep toaacuten cugraveng đọ ưu tiecircn như sau () gt ^ gt = = gt + = ndash

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 61: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Queue

bull lagrave danh saacutech magrave thecircm phải được thực hiện tại

một đầu cograven xoacutea phải thực hiện tại đầu kia

bull Queue lagrave một kiểu cấu truacutecFIFO First In First Out

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 62: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Phần tử đầu hagraveng sẽ được phục trước

phần tử nagravey được gọi lagrave front hay head

của hagraveng Tương tự phần tử cuối hagraveng

cũng lagrave phần tử vừa được thecircm vagraveo hagraveng

được gọi lagrave rear hay tail của hagraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 63: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Caacutec phương aacuten thực hiện hagravengbull Mocirc higravenh vật lyacute

ndash Coacute thể dugraveng 1 mảng Tuy nhiecircn cần phải nắm giũ cả front vagrave rear

ndash Một caacutech đơn giản lagrave ta luocircn giũ front luocircn lagrave vị triacute đầu của datildey Luacutec đoacute nếu thecircm PT vagraveo hagraveng ta chỉ việc thecircm vagraveo cuối datildey Nhưng nếu lấy ra 1 pt ta phải dịch chuyển tất cả caacutec pt của datildey lecircn 1 vị triacute

ndash Mặc dugrave caacutech lagravem nagravey rất giỗng với higravenh ảnh hagraveng đợi trong thực tế nhưng lại lagrave 1 lựa chọn rất dở với maacutey tiacutenh

bull Hiện thực tuyến tiacutenhndash Ta dugraveng 2 chỉ số Front vagrave Rear để lưu trữ đầu vagrave cuối hagraveng magrave khocircng di

chuyển caacutec phần tử

ndash Khi thecircm ta chỉ việc tăng rear lecircn 1 vagrave thecircm pt vagraveo vị triacute đoacute

ndash Khi ruacutet pt ra ta lấy pt tại front vagrave tăng front lecircn 1

ndash Nhược điểm front vagrave Rear chỉ tăng magrave khocircng giảm =gt latildeng phiacute bộ nhớ

ndash Coacute thể cải tiến bằng caacutech khi hagraveng đợi rỗng thigrave ta gaacuten lại front=rear= đầu datildey

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 64: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Hiện thực của datildey vograveng

ndash Ta dugraveng 1 datildey tuyến tiacutenh để mocirc phỏng 1 datildey vograveng

ndash Caacutec vị triacute trong vograveng trograven được đaacutenh số từ 0 đến

max-1 trong đoacute max lagrave tocircng số PTử

ndash Để thực hiện datildey vograveng chuacuteng ta cũng sử dụng caacutec

phacircn tử được đaacutenh số tương tư datildey tuyến tiacutenh

ndash Sự thay đổi caacutec chỉ số chỉ đơn giản lagrave pheacutep lấy phần

dư số học khi một chỉ số vợt quaacute max-1 noacute đc bắt

đầu trở lại vợi trị 0 Điều nagravey tương tự với việc cộng

thecircm giờ trecircn đồng hồ mặt trograven

i = ((i+1) == max) 0 (i+1)

Hoặc if ((i+1) == max) i = 0 else i = i+1

Hoặc i = (i+1) max

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 65: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Queue tăng hết mảng

bull Phaỉ xử dụng mảng với kiacutech thước lớn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 66: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 67: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Queue dạng vograveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 68: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Queue thực hiện trecircn mảng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 69: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Caacutec thao taacutec cơ bản với Queue

bull 1048699 EnqueuendashThecircm một phần tử vagraveo cuối queue

ndash 1048699 Tragraven Overflow

bull 1048699 DequeuendashXoacutea một phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Front ndashTrả lại phần tử tại đầu queue

ndash 1048699 Queue rỗng

bull 1048699 Rear ndashTrả lại phần tử tại cuối queue

ndash 1048699 Queue rỗng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 70: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 71: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Định nghĩa cấu truacutec Queue

typedef struct intqueue

Int queueAry

Int maxSize

Int count

Int front

Int rear

IntQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 72: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Tạo Queue

IntQueue CreateQueue(int max)

IntQueue queue

queue = (IntQueue )malloc(sizeof(IntQueue))

Cấp phaacutet cho mảng

queue-gtqueueAry= malloc(max sizeof(int))

Khởi tạo queue rỗng

queue-gtfront = -1

queue-gtrear = -1

queue-gtcount = 0

queue-gtmaxSize= maxSize

return queue

createQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 73: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Enqueue them vao cuoi queueInt enqueue(struct intqueue queue int datain)

if (queue-gtcount gt= queue-gtmaxSize) return 0

(queue-gtcount)++

queue-gtrear = queue-gtrear queue-gtmaxSize + 1

queue-gtqueueAry[queue-gtrear] = datain

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 74: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Dequeue Xoacutea PT ở đầu queue

int dequeue(struct intqueue queue int dOutPtr)

if(queue-gtcount)

return 0

dOutPtr= queue-gtqueueAry[queue-gtfront]

(queue-gtcount)--

queue-gtfront = (queue-gtfront +1) queue-gtmaxSize

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 75: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Front Lấy pt đầu queue

Int Front(struct intqueue queueint dOutPtr)

if(queue-gtcount)

return 0

else

dOutPtr= queue-gtqueueAry[queue-gtfront]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 76: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Rear lấy PT cuối Queue

int Rear(struct intqueue queueintdOutPtr)

if(queue-gtcount)

return 0

else

daOutPtr= queue-gtqueueAry[queue-gtrear]

return 1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 77: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull emptyQueue vagrave fullQueue

Int emptyQueue(struct intqueue queue)

return(queue-gtcount == 0)

emptyQueue

Int fullQueue(struct intqueue queue )

return( queue-gtcount == queue-gtmaxSize)

fullQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 78: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull destroyQueue

struct intqueue destroyQueue(struct intqueue queue)

if(queue)

free(queue-gtqueueAry)

free(queue)

return NULL

destroyQueue

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 79: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Bagravei tập

bull Xacircy dựng Stack vagrave Queue moacutec nối cagravei

đặt caacutec thao taacutec tương ứng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 80: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

4II2 Tree1Định nghĩa vagrave khaacutei niệm

2Cacircy nhị phacircn

ndash 1048699 Định nghĩa vagraveTiacutenh chất

ndash 1048699 Lưu trữ

ndash 1048699 Duyệt cacircy

3Cacircy tổng quaacutet

ndash 1048699 Biểu diễn cacircy tổng quaacutet

ndash 1048699 Duyệt cacircy tổng quaacutet (noacutei qua)

4Ứng dụng của cấu truacutec cacircy

ndash Cacircy biểu diễn biểu thức (tiacutenh giaacute trị tiacutenh đạo hagravem)

ndash Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 81: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

1 Định nghĩa vagrave khaacutei niệm

bull So với cấu truacutec liecircn tục như mảngdanh saacutech coacute ưu điểm vượt trội về tiacutenh mềm dẻo

bull Nhưng nhược điểm lớn của ds lagrave tiacutenh tuần tự vagrave chỉ thể hiện được caacutec mối quan hệ tuyến tiacutenh

bull Thocircng tin cograven coacute thể coacute quan hệ dạng phi tuyến viacutedụndash 1048699 Caacutec thư mục file

ndash 1048699 Caacutec bước di chuyển của caacutec quacircn cờ

ndash 1048699 Sơ đồ nhacircn sự của tổ chức

ndash 1048699 Cacircy phả hệ

bull 1048699 Sử dụng cacircy cho pheacutep tigravem kiếm thocircng tin nhanh

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 82: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Caacutec khaacutei niệm cơ bản về cacircybull Một cacircy (tree) gồm một tập hữu hạn caacutec nuacutet

(node) vagrave 1 tập hữu hạn caacutec cagravenh (branch) nối giữa caacutec nuacutet Cạnh đi vagraveo nuacutet gọi lagrave cagravenh vagraveo (indegree) cagravenh đi ra khỏi nuacutet gọi lagrave cagravenh ra (outdegree)

bull Số cạnh ra tại một nuacutet gọi lagrave bậc (degree) cuả nuacutet đoacute Nếu cacircy khocircng rỗng thigrave phải coacute 1 nuacutet gọi lagrave nuacutet gốc (root) nuacutet nagravey khocircng coacute cạnh vagraveo

bull Caacutec nuacutet cograven lại mỗi nuacutet phải coacute chiacutenh xaacutec 1 cagravenh vagraveo Tất cả caacutec nuacutet đều coacute thể coacute 01 hoặc nhiều cagravenh ra

bull Định nghĩa Một cacircy lagrave tập caacutec nuacutet magrave - lagrave tập rỗng hoặc

- coacute 1 nuacutet gọii lagrave nuacutet gốc coacute 0 hoặc nhiều cacircy con caacutec cacircy con cũng lagrave cacircyCuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 83: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Caacutec caacutech biểu diễn cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 84: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 85: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cacircy con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 86: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Đường đi

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 87: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Độ sacircu vagrave chiều cao

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 88: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cấp

CuuDuongThanCongcom httpsfbcomtailieudientucntt

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 89: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

2 Cacircy nhị phacircn

21 Định nghĩa vagrave tiacutenh chất

bull Mỗi nuacutet coacute nhiều nhất 2 nuacutet con Nuacutet traacutei vagrave nuacutet phải

bull Một tập caacutec nuacutet T được gọi lagrave cacircy nhị phacircn nếu

a) Noacute lagrave cacircy rỗnghoặc

b) Gồm 3 tập con khocircng trugraveng nhau

1) một nuacutet gốc

2) Cacircy nhị phacircn con traacutei

3) Cacircy nhị phacircn con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 90: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cacircy nhị phacircn đầy đủ

vagrave Cacircy nhị phacircn hoagraven chỉnh

Cacircy nhị phacircn đầy đủ Cacircy nhị phacircn hogravea chỉnh

Caacutec nuacutet hoặc lagrave nuacutet laacute Tất cả nuacutet laacute đều coacute cugraveng

hoặc coacute cấp = 2 độ sacircu vagrave tất cả nuacutet

giữa coacute cấp = 2

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 91: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Một số tiacutenh chất

bull Số nuacutet tối đa coacute độ sacircu i 2i

bull Gọi N lagrave số nuacutet của cacircy nhị phacircn H lagrave

chiều cao của cacircy thigrave

ndash Hmax = N Hmin = [log2N] +1

ndash Nmin = H Nmax = 2H-1

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 92: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cacircy cacircn bằng

bull Khoảng caacutech từ 1 nuacutet đến nuacutet gốc xaacutec định chi phiacute cần để định vị noacute 1 nuacutet coacute độ sacircu lagrave 5 =gt phải đi từ nuacutet gốc vagrave qua 5 cagravenh

bull Nếu cacircy cagraveng thấp thigrave việc tigravem đến caacutec nuacutet sẽ cagraveng nhanh Điều nagravey dẫn đếaacuten tiacutenh chất cacircn băfng của cacircy nhị phacircn Hệ số cacircn bằng của cacircy (balance factor) lagrave soumliuml checircnh lệch giữa chiều cao của 2 cacircy con traacutei vagrave phải của noacute

B = HL-HR

bull Một cacircy cacircn bằng khi B = 0 vagrave caacutec cacircy con của noacute cũng cacircn bằng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 93: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

22 Lưu trữ cacircy nhị phacircnbull Lưu trữ kế tiếp Sử dụng mảng

bull Lưu trữ moacutec nối Sử dụng con trỏ

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 94: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Cấu truacutec cacircy nhị phacircn

typedef structtree_node

int data

structtree_node left

structtree_node right

TREE_NODE

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 95: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Tạo cacircy nhị phacircnTREE_NODE root leftChild rightChild

Tạo nuacutet con traacutei

leftChild= (TREE_NODE )malloc(sizeof(TREE_NODE))

leftChild-gtdata = 20

leftChild-gtleft = leftChild-gtright = NULL

Tạo nuacutet con phải

rightChild = (TREE_NODE )malloc(sizeof(TREE_NODE))

rightChild-gtdata = 30

rightChild-gtleft = rightChild-gtright = NULL

Tạo nuacutet gốc

root = (TREE_NODE )malloc(sizeof(TREE_NODE))

root-gtdata = 10

root-gtleft = leftChild

root-gtright = rightChild

root -gt data= 50 gaacuten 50 cho root

CuuDuongThanCongcom httpsfbcomtailieudientucntt

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 96: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

23 Duyệt cacircy nhị phacircn

bull 1048699 Duyệt cacircy lần lượt duyệt toagraven bộ nuacutet trecircn cacircy

bull 1048699 Coacute 3 caacutech duyệt cacircy

ndash 1048699 Duyệt theo thứ tự trước

ndash 1048699 Duyệt theo thứ tự giữa

ndash 1048699 Duyệt theo thứ tự sau

bull 1048699 Định nghĩa duyệt cacircy nhị phacircn lagrave những định

nghĩa đệ quy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 97: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Duyệt theo thứ tự trước

1 Thăm nuacutet

2 Duyệt cacircy con traacutei theo thứ tự trước

3 Duyệt cacircy con phải theo thứ tự trước

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 98: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Duyệt theo thứ tự sau

1 Duyệt cacircy con traacutei theo thứ tự sau

2 Duyệt cacircy con phải theo thứ tự sau

3 Thăm nuacutet

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 99: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Duyệt theo thứ tự giữa

1 Duyệt cacircy con traacutei theo thứ tự giữa

2 Thăm nuacutet

3 Duyệt cacircy con phải theo thứ tự giữa

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 100: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Thứ tự trước 15 6 3 2 4 7 13 9 18 17 20

Thứ tự giữa 2 3 4 6 7 9 13 15 17 18 20

Thứ tự sau 2 4 3 9 13 7 6 17 20 18 15CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 101: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Duyệt theo thứ tự trướcndashĐệ quy

void Preorder(TREE_NODE root)

if (root = NULL)

tham aNode

printf(d root-gtdata)

duyet cay con trai

Preorder(root-gtleft)

duyet cay con phai

Preorder(root-gtright)

Bagravei tập Viết giải thuật đệ quy của

bull 1048698 Duyệt theo thứ tự giữa

bull 1048698 Duyệt theo thứ tự sau

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 102: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Duyệt theo thứ tự trướcndashVograveng lặp

void Preorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX) khởi tạostack

while (curr = NULL || IsEmpty(stack))

printf(d curr-gtdata) thămcurr

nếu coacute cacircy con phải đẩy cacircy con phải vagraveo stack

if (curr-gtright = NULL)

pushStack(stack curr-gtright)

if(curr-gtleft=NULL)

curr= curr-gtleft duyệt cacircy con traacutei

elsepopStack(stack ampcurr) duyệt cacircy con phải

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 103: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Duyệt theo thứ tự giữa

void Inorder_iter(TREE_NODE root)

TREE_NODE curr= root

STACK stack= createStack(MAX)ktạo stack

while(curr = NULL || IsEmpty(stack))

if (curr==NULL)

popStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= curr-gtright

elsepushStack(stack curr)

curr= curr-gtleft duyệt cacircy con traacutei

destroyStack(stack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 104: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Duyệt theo thứ tự cuối

voidPostorder_iter(TREE_NODE treeRoot)

TREE_NODE curr= treeRoot

STACK stack= createStack(MAX)ktạo một stack

while( curr = NULL || IsEmpty(stack))

if (curr == NULL)

while(IsEmpty(stack) ampamp curr==Top(stack)-gtright)

PopStack(stack ampcurr)

printf(ldquodrdquo curr-gtdata)

curr= isEmpty(stack) NULL Top(stack)-gtright

else

PushStack(stack curr)

curr= curr-gtleft

destroyStack(ampstack) giải phoacuteng stack

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 105: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Một vagravei ứng dụng của duyệt cacircy

1Tiacutenh độ cao của cacircy

2Đếm số nuacutet laacute trong cacircy

3Tiacutenh kiacutech thước của cacircy (số nuacutet)

4Sao cheacutep cacircy

5Xoacutea cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 106: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Tiacutenh độ cao của cacircy

int Height(TREE_NODE tree)

Int heightLeft heightRight heightval

if( tree== NULL )

heightval= -1

else

Sửdụng phương phaacutep duyệt theo thứ tự sau

heightLeft= Height (tree-gtleft)

heightRight= Height (tree-gtright)

heightval= 1 + max(heightLeftheightRight)

return heightval

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 107: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Đếm số nuacutet laacute

int CountLeaf(TREE_NODE tree)

if (tree == NULL)

return 0

int count = 0

Đếm theo thứ tự sau

count += CountLeaf(tree-gtleft) Đếm traacutei

count += CountLeaf(tree-gtright)Đếm phải

nếu nuacutet tree lagrave nuacutet laacute tăng count

if(tree-gtleft == NULL ampamp tree-gtright == NULL)

count++

return count

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 108: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Kiacutech thước của cacircy

int TreeSize(TREE_NODE tree)

if(tree== NULL)

return 0

else

return( TreeSize(tree-gtleft) +

TreeSize(tree-gtright) + 1 )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 109: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Sao cheacutep cacircy

CuuDuongThanCongcom httpsfbcomtailieudientucntt

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 110: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

TREE_NODE CopyTree(TREE_NODE tree)

Dừng đệ quy khi cacircy rỗng

if (tree== NULL) return NULL

TREE_NODE leftsub rightsub newnode

leftsub=CopyTree(tree-gtleft)

rightsub= CopyTree(tree-gtright)

tạo cacircy mới

newnode= malloc(sizeof(TREE_NODE))

newnode-gtdata = tree-gtdata

newnode-gtleft = leftsub

newnode-gtright = rightsub

return newnode

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 111: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Xoacutea cacircy

void DeleteTree(TREE_NODE tree)

xoacutea theo thứ tự sau

if(tree = NULL)

DeleteTree(tree-gt left)

DeleteTree(tree-gt right)

free(tree)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 112: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

3 Cacircy tổng quaacutet

31 Biểu diễn cacircy tổng quaacutet

bull Biểu diễn giống như cacircy nhị phacircn

ndash Mỗi nuacutet sẽ chứa giaacute trị vagrave caacutec con trỏ trỏ đến

caacutec nuacutet con của noacute

ndash Bao nhiecircu con trỏ cho một nuacutet gtgtKhocircng hợp

lyacute

bull Mỗi nuacutet sẽ chứa giaacute trị vagrave một con trỏ trỏ

đến một ldquotậprdquo caacutec nuacutet con

ndash Xacircy dựng ldquotậprdquo như thế nagraveo

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 113: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Biểu diễn cacircy tổng quaacutet

bull Sử dụng con trỏ nhưng mở rộng hơn

ndash 1048699 Mỗi nuacutet sẽ coacute 2 con trỏ một con trỏ trỏ đến nuacutet

con đầu tiecircn của noacute con trỏ kia trỏ đến nuacutet anh

em kề với noacute

ndash 1048698 Caacutech nagravey cho pheacutep quản lyacute số lượng tugravey yacute của

caacutec nuacutet con

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 114: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Vi du

CuuDuongThanCongcom httpsfbcomtailieudientucntt

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 115: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

32 Duyệt cacircy tổng quaacutet1Thứ tự trước

1Thăm gốc

2Duyệt cacircy con thứ nhất theo thứ tự trước

3Duyệt caacutec cacircy con cograven lại theo thứ tự trước

2Thứ tự giữa

1Duyệt cacircy con thứ nhất theo thứ tự giữa

2Thăm gốc

3Duyệt caacutec cacircy con cograven lại theo thứ tự giữa

3Thứ tự sau

1Duyệt cacircy con thứ nhất theo thứ tự sau

2Duyệt caacutec cacircy con cograven lại theo thứ tự sau

3Thăm gốcCuuDuongThanCongcom httpsfbcomtailieudientucntt

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 116: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

4 Ứng dụng của cacircy nhị phacircn

bull 1048699 Cacircy biểu diễn biểu thức

ndash 1048699 Tiacutenh giaacute trị biểu thức

ndash 1048699 Tiacutenh đạo hagravem

bull 1048699 Cacircy quyết định

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 117: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cacircy biểu diễn biểu thức lagrave

Một loại cacircy nhị phacircn đặc biệt trong đoacute

1 Mỗi nuacutet laacute chứa một toaacuten hạng

2 Mỗi nuacutet giữa chứa một toaacuten tử

3 Cacircy con traacutei vagrave phải của một nuacutet toaacuten

tử thể hiện caacutec biểu thức con cần được

đaacutenh giaacute trước khi thực hiện toaacuten tử tại

nuacutet gốc

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 118: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Biểu thức nhị phacircn

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 119: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Caacutec mức chỉ ra thứ tự ưu tiecircn

bull Caacutec mức (độ sacircu) của caacutec nuacutet chỉ ra thứ tự ưu tiecircn tương đối của chuacuteng trong biểu thức (khocircng cần dugraveng ngoặc để thể hiện thứ tự ưu tiecircn)

bull Caacutec pheacutep toaacuten tại mức cao hơn sẽ được tiacutenh sau caacutec caacutec pheacutep toaacuten coacute mức thấp

bull Pheacutep toaacuten tại gốc luocircn được thực hiện cuối cugraveng

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 120: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull Dễ dagraveng để tạo ra caacutec biểu thức tiền tố trung tố

hậu tố

bull Trung tố( ( 8 -5 ) ( ( 4 + 2 ) 3 ) )

bull Tiền tố -8 5 + 4 2 3

bull Hậu tố 8 5 -4 2 + 3

(thực chất lagrave caacutec pheacutep duyệt theo tt giữa trước vagrave sau)CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 121: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cagravei đặt cacircy biểu thức

bull Mỗi nuacutet coacute 2 con trỏ

struct TreeNode

InfoNode info Dữ liệu

TreeNode left Trỏ tới nuacutet con traacutei

TreeNode right Trỏ tới nuacutet con phải

CuuDuongThanCongcom httpsfbcomtailieudientucntt

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 122: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

bull InfoNode coacute 2 dạng

enum OpType OPERATOR OPERAND

struct InfoNode

OpType whichType

union ANONYMOUS union

char operator

int operand

CuuDuongThanCongcom httpsfbcomtailieudientucntt

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 123: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

int Eval(TreeNode ptr)

switch(ptr-gtinfowhichType)

case OPERAND

returnptr-gtinfooperand

case OPERATOR

switch ( tree-gtinfooperation )

case bdquo+‟

return ( Eval( ptr-gtleft ) + Eval( ptr-gtright ) )

case bdquo-‟

return ( Eval( ptr-gtleft ) -Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

case bdquo‟

return ( Eval( ptr-gtleft ) Eval( ptr-gtright ) )

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 124: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cacircy quyết định

bull Dugraveng để biểu diễn lời giải của bagravei toaacuten cần

quyết định lựa chọn

bull Bagravei toaacuten 8 đồng tiền vagraveng

ndash Coacute 8 đồng tiền vagraveng a b c d e f g h

ndash Coacute một đồng coacute trọng lượng khocircng chuẩn

ndash Sử dụng một cacircn Roberval (2 đĩa)

ndash Output

bull Đồng tiền k chuẩn lagrave nặng hơn hay nhẹ hơn

bull Số pheacutep cacircn lagrave iacutet nhất

CuuDuongThanCongcom httpsfbcomtailieudientucntt

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 125: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

CuuDuongThanCongcom httpsfbcomtailieudientucntt

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 126: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

void EightCoins(a b c d e f g h)

if (a+b+c == d+e+f)

if (g gt h) Compare(g h a)

else Compare(h g a)

else if (a+b+c gt d+e+f)

if (a+d == b+e) Compare(c f a)

else if (a+d gt b+e) Compare(a e b)

else Compare(b d a)

else

if (a+d == b+e) Compare(fca)

else if (a+d gt b+e) Compare(d b a)

else Compare(e a b)

so saacutenh x với đồng tiền chuẩn z

void Compare(xyz)

if(xgty) printf(ldquox nặngrdquo)

else printf(ldquoy nhẹrdquo)

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt

Page 127: Chương 4: Một số cấu trúc dữ liệu và giải thuật căn bản 1 ... file• Các bài toán thực tế thường phức tạp • Hiểu bài toán đặt ra == để

Cac giai thuat tim kiem va sap xep

bull SV tu nghien cuu

CuuDuongThanCongcom httpsfbcomtailieudientucntt