Các nút còn l i, mỗi nút phải có chính xác m t cành vào... Các nút không phải nút g c ho nú ợc g i là nút trung gian hay nút trong internal node.. sâu của cây bằn sâu của nút lá sâu nh
Trang 1
Ths Tô Văn Nam
N n n Mssv: 20070095
Trang 2
4
I n n n 4
II n an n n n 4
A 5
I T n an 5
1 Các khái ni m ản v cây 5
2 Cây nhị phân 7
II T n an an n 12
1 ịn n ĩa danh sách 12
2 Danh sách liên k t trong mảng liên t c 14
3 n a 17
B n n 18
I n 18
1 năn 18
2 năn 18
II n a n 18
1 a ô n a 18
2 a ô n 20
III n 21
1 m n ản 21
2 m n 21
3 m n 22
C T n 23
I n 23
1 T n n tsort 23
2 n a a 23
3 n a 23
Trang 36 T 25
7 T n ị 27
II a n 27
III n n 30
IV n n n 31
D n n n n 31
E T am ả 66
Trang 4
I
N i dung: Giả s bi u th c toán h ợc bi u di n b i cây bi u th c, có g c tr
b i T, mỗi nút trên cây có cấu trúc :
struct Nut {
Kieu : Byte {phân lo i nút trên cây } struct
N *L TR, *R TR /*G ịa ch g c cây con trái và
g c cây con phải của nó */
}
Ý n ĩa ủa ng gi n n mô ả n n 6, u ‘’ Cấu trúc
gi li u và giải thu “
Yêu c u : Vi n n n ực hi n các yêu c u sau :
1 Nh n bi t các thành ph n tham gia vào bi u th c: Bi n, hằng, dấu
phép toán và lo i của nó
2 T o cây bi u th c bi u di n m t bi u th
3 L p bảng SYM-V LUE c vào giá trị các bi n có trong bi u
th c , chuy n các xâu ký tự bi u di n các hằng có trong bi u th c
K ú ợt thực t p sinh viên phải:
N m ợc ph n lý thuy t trong giáo trình Cấu trúc gi li u và giải thu t
Trang 5float Heso; /*H s */
};
Giả s danh sách các s h n ợ bằng mảng m t chi u
Yêu c u: Vi rì c hi n các yêu c u sau:
S p x p mảng theo th tự giảm d n của n S m n p x p là
K ú ợt thực t p sinh viên phải:
N m ợc ph n lý thuy t trong giáo trình Cấu trúc gi li u và giải thu t
N m ợc các kỹ thu t l p trình, s d ng thành th o ngôn ng l n c
T ợt tác phong làm vi c t p th cùng giải quy t m t vấn
Sa ợt thực t p, nhóm sinh viên phải làm báo cáo thực t p có n i dung :
A
I c
1
M t cây (tree) - hình 9.1- g m m t t p h u h n các nút (node) và m t t p h u
h n các cành (branch) n i gi a nú n nú i là cành vào (indegree),
n a i nút g i là cành ra (outdegree) S cành ra từ m t nút g i là b c
(degree) của nú N u cây không rỗng thì phải có m t nút g i là nút g c (root),
nút này không có cành vào Cây trong hình 9.1 có M là nút g c Các nút còn l i, mỗi nút phải có chính xác m t cành vào Tất cả nú u có th có 0, 1, ho c nhi u
n cành ra
Trang 6Nút lá (leaf) ợ ịn n ĩa n nú ủa cây mà s cành ra bằng 0 Các nút
không phải nút g c ho nú ợc g i là nút trung gian hay nút trong (internal
node) Nút có s cành ra khác 0 có th g i là nút cha (parent) của các nút mà cành ra
của n , nú n ũn ợc g i là các nút con(child) của nó Các nút cùng
a ợc g i là các nút anh em (sibling) v i nhau.Nút trên nút cha có th g i là nút
ông (grandparent, trong m t s bài toán ún a ũn n g n n trình
bày giải thu t)
Theo hình 9.1, các nút lá g m: N, B, D, T, X, E, L, S; các nút trung gian g m: A,
C, O, Y Nút Y là cha của hai nút T và X T và X là con của Y, và là nút anh em v i
nhau
nk sao cho ni là nút cha của nút ni+1 v ≤ < Chi u dài (length) đ ờng đ này là s
n n n , -1 Mỗ nú n u dài bằn 0 n chính nó Trong
m t cây, từ nút g n mỗi nút còn l i ch có duy nhất m t n
i v i mỗi nút n i, đ sâu (depth) hay còn g i là m c (level) của nó chính là
chi n n ất từ nút g n nó c ng 1 Nút g c có m c bằng 1 Chi u
nút lá có chi u cao bằng 1 Chi u cao của cây bằng chi u cao của nút g c sâu
của cây bằn sâu của nút lá sâu nhất, nó luôn bằng chi u cao của cây
Trang 7M t cây có th ợc chia thành nhi u cây con (subtree) M t cây con là bất kỳ
m t cấ ú n i của nút g Nú u tiên của cây con là nút g c của nó và
ô n i ta dùng tên của nú n g i cho cây con Cây con g c A (hay g i t t
là cây con A) g m các nút A, N, C, B M n ũn chia thành nhi u cây
con khác Khái ni m cây con dẫn n ịn n ĩa n sau:
Đị ĩ : M t cây là t p các nút mà
- là t p rỗng, ho c
- có m t nút g i là nút g c có không ho c nhi n, n ũn là cây
Các cách bi u di n cây
T ôn ng có 3 cách bi u di n cây: bi u di n bằn thị – hình 9.1a, bi u
di n bằng cách canh l – hình 9.1b, và bi u di n bằng bi u th c có dấu ngo c – hình 9.1c
2 ị
1 C đị ĩ
Đị ĩ : M t cây nhị phân ho c là m t cây rỗng, ho c bao g m m t nút g i là
nút g c (root) và hai cây nhị n ợc g i là cây con bên trái và cây con bên phải
của nút g c
L ằn ịn n ĩa n ịn n ĩa n c cho m t cấ ú c tả
cây nhị n n m t ki u d li u trừ ợng, chúng ta c n ch ra các tác v có th
thực hi n trên cây nhị n n ản của m t cây nhị phân t ng quát
ún a n n có th là t o cây, giải phóng cây, ki m tra cây rỗng, duy ,…
ịn n ĩa n ôn an m n cách hi n thực của cây nhị phân trong b
nh Chúng ta sẽ thấy ngay rằng m t bi u di n liên k t là tự nhiên và d s d ng,
n n n thự n mảng liên t ũn thích hợ ịnh n ĩa n
ũn ôn an m n các khóa ho c cách mà chún ợc s p th tự Cây nhị
n ợc dùng cho nhi u m n có tìm ki m truy xuấ ,
chúng ta c n gi m ịn n ĩa ng quát
Trang 8T m é a n c tính chung của cây nhị phân, chúng ta hãy
quay v ịn n ĩa ng quát và nhìn xem bản chấ quy của nó th hi n n nào
trong cấu trúc của m t cây nhị phân nh
T ng hợp th nhất, m ng hợ ản ôn n an n , là
m t cây nhị phân rỗng
Cách duy nhấ xây dựng m t cây nhị phân có m t nút là nú c và
cho hai cây con trái và phải là hai cây rỗng
V i cây có hai nút, m t trong hai sẽ là g c và nút còn l i sẽ thu c cây con Ho c
cây con trái ho c cây con phải là cây rỗng, và cây còn l i ch a chính xác ch m t nút
N v y có hai cây nhị phân khác nhau có hai nút Hai cây nhị phân có hai nút có th ợc
i v ng hợp cây nhị phân có ba nút, m t trong chúng sẽ là g c, và hai nút
còn l i có th ợc chia gi a cây con trái và cây con phải theo m t trong các cách sau:
2 + 0 1 + 1 0 + 2
Do có th có hai cây nhị phân có hai nút và ch có m t cây rỗn , ng hợp th
nhất trên cho ra hai cây nhị n T ng hợp th a, n ự, cho thêm hai cây
Trang 9duy nhất m t cây nhị phân có m nú n n ng hợp này ch có m t cây nhị phân
Tất cả ún a năm n ị phân có ba nút:
xây dựng cây này là m n n ng hợp l n n
Chúng ta b t u từ g c của cây và xem các nút còn l n cách phân chia gi a
cây con trái và cây con phải Cây con trái và cây con phải lúc này sẽ là các ng hợp
nh n m ún a t
G i N là s nút của cây nhị phân, H là chi u cao của cây thì,
Hmax = N, Hmin = ⎣log2N⎦ +1
Nmin = H, Nmax = 2H-1
Khoảng cách từ m nú n nút g ịnh chi phí c n ịnh vị nó Chẳng
h n m nú sâu là 5 thì chúng ta phả ừ nút g c và qua 5 cành n n
từ g n n m n n , n u cây càng thấp thì vi c tìm n các nút sẽ càng
n an u này dẫn n tính chất cân bằng của cây nhị phân H s cân bằng của cây
(balance factor) là sự chênh l ch gi a chi u cao của hai cây con trái và phải của nó:
B = HL-HR
M t cây cân bằng khi h s này bằng 0 và các cây con của n ũn n ằng
M t cây nhị phân cân bằng v i chi a c sẽ có s nút là l n nhất có th
N ợc l i, v i s nú c cây nhị phân cân bằng có chi u cao nh nhất Thông
n u này rất khó xả a n n ịn n ĩa n i l n n i các trị B = –1,
0, ho c 1 thay vì ch là 0 Chúng ta sẽ h c kỹ n cây cân bằng AVL trong ph n
sau
M t cây nhị đ đủ (complete tree) ợc s nút t a i chi u
cao của n ũn n =0 i m i nút Thu t ng cây nhị phân g n
đ đủ ũn ợc dùng ng hợ ợc chi u cao t i thi u của nó
và m i nút m c l n nhất d n h t v bên trái
Trang 10Hình 9.3 bi u di n cây nhị n ủ có 31 nút Giả s lo nú 9, , 3,
25, 27, 29, 31 ta có m t cây nhị phân g n n ủ
2 C c
Cách ch n các tên preorder, inorder, và postorder cho ba phép duy t cây trên
không phải là tình c , nó liên quan ch t chẽ n m t trong nh ng ng d n , là các
cây bi u th c
M t cây bi u th c (expression tree) ợc t o nên từ các toán h n n ản và các
toán t (s h c ho c lu n lý) của bi u th c bằng cách thay th các toán h ng n ản
bằng các nút lá của m t cây nhị phân và các toán t bằng các nút bên n i
v i mỗi toán t hai ngôi, cây con trái ch a m i toán h ng và m i toán t thu c toán
h ng bên trái của toán t , n ải ch a m i toán h ng và m i toán t thu c
toán h ng bên phải của nó
Trang 11i v i toán t m t ngôi, m t trong hai cây con sẽ rỗn ún a ng vi t
m t vài toán t m t ngôi phía bên trái của toán h ng của chúng, chẳng h n dấu trừ
(phép lấy s âm) ho c các hàm chu n n () () n m t ngôi khác
ợc vi t bên phải của toán h ng, chẳng h n hàm giai thừa ()! ho c hàm n n
()2 ô ả a a u hợp l , n é ấ o hàm có th vi t d/dx phía bên
trái, ho ()’ a n ải, ho c toán t ăn ++ ản ng
khác nhau khi nằm bên trái ho c nằm bên phải N u toán t ợc ghi bên trái, thì
trong cây bi u th c nó sẽ có cây con trái rỗn , n y toán h ng sẽ xuất hi n bên
phải của nó n N ợc l i, n u toán t xuất hi n bên phải, thì cây con phải của
nó sẽ rỗng, và toán h ng sẽ là cây con trái của nó
M t s cây bi u th c của m t vài bi u th n ản ợc minh h a trong hình
9.4 Hình 9.5 bi u di n m t công th c b c hai ph c t n a tự duy t cây
chu n cho cây bi u th c này li t kê trong hình 9.6
Các tên của các phép duy n an n các d ng Balan của bi u th c: duy t cây
bi u th c theo preorder là d ng prefix, n mỗi toán t nằm c các toán h ng
của nó; duy t cây bi u th c theo inorder là d ng infix (cách vi t bi u th c quen thu c
của chúng ta); duy t cây bi u th c theo postorder là d ng postfix, m i toán h ng nằm
c toán t của ún N y các cây con trái và cây con phải của mỗi nút luôn là
Trang 12trong ba d ng Balan hoàn toàn gi ng v i th tự n i của các l n ghé các thành
ph n này theo m t trong ba phép duy t cây bi u
II
1 ị ĩ
Chúng ta b u bằng vi ịn n ĩa u cấu trúc d li u trừ ợng g i là danh
sách (list) ũn n n n ăn p và hàng, danh sách bao g m m t chuỗi n i ti p
Trang 138 Truy xuất ph n t t i m t vị n ủa danh sách
9 Thay th ph n t t i m t vị trí nào ủa danh sách
10 Duy t danh sách, thực hi n m t công vi c trên mỗi ph n t
Ngoài ra còn m t s tác v khác có th áp lên m t chuỗi n i ti p các ph n t
Chúng ta có th xây dựng rất nhi u d ng khác nhau cho các ki u cấu trúc d li u trừu
ợn n ự bằng cách s d ng các gói tác v khác nhau Bất kỳ m t trong các
d n n u có th ợ ịn n ĩa n i CTDL danh sách Tuy nhiên, chúng
ta ch t p trung vào m t danh sách c th mà các tác v của nó có th ợc m n
m t khuôn mẫu minh h a ng và các vấn c n giải quy t trên danh sách
Trang 142 r
M t vài ngôn ng a n n ất ph bi n n F an, a không
cung cấp khả năn d ng b nh ng ho c con tr N u c n s d ng các ngôn ng
n giải quy n m n trên danh sách liên k t (DSLK)
t a n ẳn trên danh sách liên t c (vi c thay i m t vài con tr d dàng
n an n n n u vi c phải chép l i m t s ợng l n d li u), chúng ta vẫn
có th s d ng mảng liên t mô ph ng DSLK Trong ph n này chúng ta sẽ tìm
hi u m t hi n thực của DSLK mà không c n con tr Hay nói cách khác, chúng ta
không dùng con tr ch a ịa ch , mà sẽ dùng con tr là m t s nguyên, và DSLK sẽ
ợc hi n thực trong m t mảng liên t c
a.P ươ
Ý ng chính u từ m t mảng liên t ùn ch a các ph n t của
m t DSLK Chúng ta xem mản n n m t vùng nh a d ng và chúng ta sẽ
tự phân ph i lấy Chúng ta sẽ xây dựng m t s m quản lý mảng này: nh n bi t
vùng nào trong mản a ợc s d ng, n i k t các ph n t trong mảng theo m t th
tự mong mu n
M m của DSLK mà chúng ta phải b qua trong ph n này là vi c ịnh vị
b nh ng, ngay từ u chúng ta phả ịn c c n thi t cho mảng M i
m còn l i khác của SL ợc gi n n, n n m m dẻo trong vi c t
Trang 15Hi n thực DSLK trong mảng liên t ũn ra rất hi u quả trong nh ng ngôn
ng tựa C++ có cung cấp con tr ịnh vị b nh ng Các ng d ng
ợc xem là thích hợp khi s d ng DSLK trong mảng liên t c :
li u ch a các thông tin v n n n n ợc gán cho các sinh viên theo th
tự nh n , n m s không theo m t th tự c bi t nào Thông tin v sinh
viên có th ợc tìm thấy nhanh chóng dựa vào mã sinh viên do s n ợc dùng
n s tìm trong mảng liên t c Tuy nhiên, th nh thoảng chúng ta c n in danh
sách sinh viên có th tự n, u này có th m ợc bằng cách l n theo các
th tự nh các tham chi u trong các mản n ng
thấ ợc cách hi n thực này của DSLK làm vi n nào, chúng ta hãy
duy t DSLK next_name trong ph n u của n 4.5 u vào của danh sách ch a trị 8, n ĩa n t trong vị trí 8, Arthur, E., là ph n t u tiên của danh sách
Vị trí 8 của next_name ch a trị 0, n ĩa n vị trí 0, Clark, F., là ph n t
th hai Vị trí 0 của next_name ch trị 5, v y Evans, B., là ph n t k ti p Vị trí 5
Trang 16N trong hình 4.5, hi n thực của DSLK trong mảng liên t ợc tính
linh ho t của SL i v i nh ng sự a i Ngoài ra nó còn có khả năn chia sẻ
thông tin (chẳng h n tên sinh viên) gi a các DSLK khác nhau Hi n thực n ũn
òn m của danh sách liên t c là có th truy xuất ngẫu nhiên các ph n t nh
cách s d ng ch s truy xuất trực ti p
Trong hi n thực của DSLK trong mảng liên t c, các con tr tr thành các ch s
n i so v m b u của danh sách Các tham chi u của danh sách ch a
trong m t mảng, mỗi ph n t của mảng ch a m t s nguyên ch n vị trí của ph n t
k của danh sách trong mảng ch a d li phân bi t v i các con tr (pointer) của
DSLK trong b nh ng, chúng ta sẽ dùng từ chỉ s (index) g i các tham chi u
này
Chúng ta c n khai báo hai mảng liên t c cho mỗi DSLK, entry[ ] ch a d
li u, và next_node[ ] ch a ch s ch n ph n t k i v i ph n l n các
ng d ng, entry là m t mảng mà mỗi ph n t là m t cấu trúc, ho c m t vài mảng
n ng hợp ngôn ng l p trình không cung cấp ki u cấu trúc Cả hai mảng
m t hằng s bi c
Do chúng ta dùng ch s b u từ 0, chúng ta sẽ dùng trị c bi t – bi u di n
an ú , n ự n ị NULL của con tr trong b nh ng
Trang 19đư
N a
ị
ô n é n a a
3 ô n é n n a
4 ô n é n n
ĩ
- EX ( )=EX ( ) a ẽ ả ự n n ị EF a nú , n n ôn ả a nú m n n n n an n n ( ( )) - N EX ( ) EX ( ) ( n ợ ũn n ự ) ả a é nú
n an ủa ( )
- N m an ú n òn ủa an a ẽ ợ a
é n n an ủa ( )
Trang 205 a
T m n n 6 ú T n n 2 Ca2:
B1: ư
N
ô n
3 a
4 ú
N
ị
T n n ị
ị
2.2
ị
3 a
T m n n
4 ú
T n n
Trang 223 đ đ đỉ
a
Trang 24DaThuc DaThuc::Nhan(DaThuc Data)
//Thuc hien nhan da thuc voi da thuc
Trang 27case 1: return(Giatri(n->LPTR)+Giatri(n->RPTR));
case 2: return(Giatri(n->LPTR)-Giatri(n->RPTR));
case 3: return(Giatri(n->LPTR)*Giatri(n->RPTR));
case 4: return(Giatri(n->LPTR)/Giatri(n->RPTR));
case 5: return((int)pow(Giatri(n->LPTR), Giatri(n->RPTR)));
case 6: return((-1)*Giatri(n->RPTR));
Trang 28n
G a n m n a
Trang 29G a n m n n mô n a
G a n mô n
Trang 31a 3 TT_DOHOA.CPP, TT_DOHOA.EXE, EGAVGA.BGI
+C_Huon T a m n n n ủa n n ùn n ôn n
Trang 32SoHang(int SoMu,int HeSo){ soMu=SoMu;heSo=HeSo;}
void Set(int SoMu,int HeSo){soMu=SoMu;heSo=HeSo;}
ToaDo(int x,int y){X=x;Y=y;}
void Set(int x,int y){X=x;Y=y;}
void VeHop(int X1,int Y1,int X2,int Y2,char* String);
void VeHop(int X1,int Y1,int X2,int Y2,int MauNen,int MauChu,char*
String);
void VeHop(int X1,int Y1,int X2,int Y2,int Number);
void VeHop(int X1,int Y1,int X2,int Y2,int MauNen,int MauChu,int
Number);
void XoaHop(int ,int,int, int);
void VeMenu(int X1,int Y1,int X2,int Y2,char* String);
void VeMenu(int X1,int Y1,int X2,int Y2,int MauNen,int MauChu,char* String);
BangToaDo(int X,int Y);
void Set(int X,int Y);
Trang 33void DeleteSoHang(int Vitri);
void VeSoHang(int ViTri,int X, int Y);
//Xoa so hang tai vi tri x,y
ToaDo toaDo[25];
void Insertsort();
public:
DaThuc();
DaThuc(int X,int Y);
void SetHeSo(int ViTri,int Data);
void SetSoMu(int ViTri,int Data) ;
int GetLength();
float GetHeSo(int ViTri);
int GetSoMu(int ViTri);
SoHang* GetDaThuc();
void Set(SoHang *Data,int Length);
void Set(SoHang *Data,int Length,int X,int Y);
void Show(char *);
void Show(ToaDo Toado);
void Show(int,int);
void ChuanHoa();
DaThuc Nhan(DaThuc Data);
DaThuc Nhan(int Data);
DaThuc Cong(DaThuc Data);
DaThuc Tru(DaThuc DaTa);
//void ConvertSoHang(int Vitri,char *Temp);
DaThucMoPhong(int X,int Y);
void SetToaDo(ToaDo toado);
void SetToaDo(int ViTri,ToaDo Data);
void SetDaThuc(DaThuc Data);
ToaDo GetToaDo(int ViTri);
void KhoiDong();
void VeDaThuc();
void VeDaThuc(ToaDo Toado);
void DiChuyenSoHang(int ViTri,ToaDo Toado);
void VeSoHang(int ViTri,int MauSac);
void VeSoHang(int ViTri);
void ChuyenSoHang(SoHang Sohang,ToaDo Toado1,ToaDo Toado2);
void VeSoHang(ToaDo toado);
void VeSoHang(SoHang Sohang, ToaDo Toado, int Mausac);
void VeSoHang(SoHang Sohang, ToaDo Toado);
};
//Lop Thuc hien chu nang mo phong da thuc bang do hoa
//*********CHUONG TRINH MO PHONG CAY BIEU THUC**********