IV. GIẢI THUẬT MÊ HÓA HUFFMAN 1.Đặt vấn đề
5. Quy tắc biểu diễn một biểu thức toân học trín cđy TOP
IIỊ CĐY NHỊ PHĐN (BINARY TREE) 1 Ðịnh nghĩa
1. Ðịnh nghĩa
TOP Cđy nhị phđn lă một cđy mă trong đó mỗi nút chỉ có tối đa 2 nút con (2 nhânh)
Trong một cđy nhị phđn ta cần phđn biệt con trâi (leftchild) vă con phải (rightchild) của một nút.
Ta quy ước vẽ nút con trâi ở bín trâi nút cha vă nút con phải ở bín phải nút chạ 1 2 3 4 5 Ví dụ:
Nếu ta xem (a), (b) lă cđy vă lă cđy có thứ tự thì 2 cđy năy chỉ lă một. Nếu nói lă cđy nhị phđn thì đđy lă 2 cđy khâc nhaụ
Một số dạng đặc biệt của cđy nhị phđn :
Cđy lệch trâi : Câc nút trín cđy chỉ có con trâi không có con phảị Cđy lệch phải : Câc nút trín cđy chỉ có con phải không có con trâị
Cđy zic-zắc: Lă cđy mă nếu nút ở mức i chỉ có một con (phải hoặc trâi) thì nút ở mức i+1 cũng chỉ có 1 con (phải hoặc trâi).
Cđy nhị phđn đầy đủ: Lă cđy nhị phđn mă câc nút đều có đủ 2 con trâi vă phải (trừ nút lâ).
2. Tính chất
TOP
Câch căi đặt năy sẽ rất phí miền nhớ khi cđy nhị phđn lă một cđy có dạng đặc biệt cđy lệch trâi, cđy lệch phải, cđy zic-zắc,... vă chỉ thích hợp với cđy nhị phđn đầy đủ.
Khai bâo : Const Maxlenght = ... ; Type LabelType = ... ; Node = Record LeftChild : Integer; RightChild : Integer; Label : LabelType; End; Tree = array [1 .. Maxlenght ] of Node ; b. Căi đặt cđy nhị phđn bằng con trỏ :
Trong câch căi đặt năy mỗi nút sẽ lă một record gồm có 3 trường : + Left : con trỏ giữ địa chỉ của nút con trâị
+ Right : con trỏ giữ địa chỉ của nút con phảị + Info : Lưu trữ nhản (nội dung) của nút.
Left Info Right Khai bâo : Type ElementType = ... ; Tree = ^ Node ; Node = Record Elements : ElementType; Left : Tree ; Right : Tree ; End;
Thủ tục khởi tạo cđy rỗng :
Ðể có thể truy cập đến câc nút trín cđy, ta cần có một con trỏ T để trỏ đến nút gốc của cđy đó. Khi cđy rỗng thì con trỏ sẽ trỏ đến một giâ trị đặt biệt Nil.
Procedure MakeNullTree (Var T : Integer);
Begin
T := Nil; End;
Hăm tạo cđy :
Function MakeTree ( x : ElementType ; L, R : Tree) : Tree;
Var T : Tree ; Begin
New (T) ;
T. Left := L; T. Right := R; MakeTree := T; End;
Hăm xâc định chiều cao của cđy
Function HighTree( T : Tree ) : Integer ;
Function Max ( a, b : Integer ) : Integer; Begin
If a < b then Max := b Else Max := a ; End;
Begin { High tree } If T = Nil then HighTree := 0 Else
If ( T^.Left = Nil ) and ( T^.Right = Nil ) then HighTree := 0
Else HighTree := Max (HighTree(T^.Left), HighTree (T^.Right) + 1; End;
Hăm xâc định chiều cao của cđy
Function NumNode( T : Tree ) : Integer ;
Begin If T = Nil then NumNode := 0
Else NumNode := (NumNode(T^.Left), NumNode (T^.Right) + 1; End;
Duyệt cđy nhị phđn
Duyệt tiền tự : (NLR)
Procedure PreOrder ( T : Tree );
Begin
If T < > Nil then
Begin
Write ( T^.Elements ); PreOrder (T^.Left);
PreOrder (T^.Right); End; End;
Duyệt trung tự : (LNR)
Procedure InOrder ( T : Tree );
Begin
If T < > Nil then
Begin
InOrder (T^.Left);
Write ( T^.Elements ); InOrder (T^.Right); End;
End;
Duyệt hậu tự : (LNR)
Procedure PostOrder ( T : Tree );
Begin
Begin PostOrder (T^.Left); PostOrder (T^.Right); Write ( T^.Elements ); End; End;
Hăm tính trị của một biểu thức
- Cđy biểu thức lă cđy nhị phđn trong đó câc nút trung gian sẽ chứa câc toân tử, còn câc lâ sẽ chứa câc toân hạng.
- Khi thực hiện tính giâ trị của một cđy biểu thức, ta sẽ tính theo đúng thứ tự của phĩp duyệt cđy trung tự.
Function Value(T : Tree) : Real;
Var x : Real; Code : integer; Begin
If (T^.Left = Nil) and (T^.Right = Nil) then Begin
Val (T^.Elements, x , Code); Value := x;
End Else Begin
If T^.Elements = '+' then Value:= Value (T^.Left) + Value (T^.Right); If T^.Elements = '-' then Value:= Value (T^.Left) - Value (T^.Right);
If T^.Elements = '*' then Value:= Value (T^.Left) *Value (T^.Right); If T^.Elements = '/' then
If Value(T^.Right) < > 0 then
Value:= Value (T^.Left) / Value (T^.Right) Else Write('Loi chia cho 0 ');
End; End;