Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Ứ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
Đầ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
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
Đổ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
Ứ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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Đườ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
Độ 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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Đế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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Cac giai thuat tim kiem va sap xep
bull SV tu nghien cuu
CuuDuongThanCongcom httpsfbcomtailieudientucntt