ĐỊNH NGHĨACây nhị phân là cây có các nút đã được khoá hóa và được sắp xếp theo một thứ tự phản ánh vị trí của nút ở trong cây.. Với mỗi một nút:+ Toàn bộ những nút ở cây con bên trái của
Trang 2Néi dung chÝnh cña bµi
I §Þnh nghÜa c©y nhÞ ph©n
II BiÓu diÔn c©y nhÞ ph©n
III C¸c phÐp to¸n duyÖt c©y nhÞ ph©n
iV Mét sè thao t¸c trªn c©y nhÞ ph©n Bµi tËp
Trang 3I ĐỊNH NGHĨA
Cây nhị phân là cây có các nút đã được khoá hóa và được sắp xếp theo một thứ tự phản ánh vị trí của nút ở trong cây.
Đặc điểm của cây nhị phân:
Mọi nút trên cây chỉ có tối đa 2 con.
Với mỗi một nút:+ Toàn bộ những nút ở cây con bên trái của nó đều có khoá nhỏ hơn khoá của nó.
+ Toàn bộ những nút ở cây con bên phải của nó đều có khoá lớn hơn khoá của nó.
Trang 4
Ví dụ:
Đây là cây nhị phân với toán tử ứng với gốc, toán hạng 1 ứng với cây con trái, toán hạng 2 ứng với cây con phải
Trang 5Một số dạng đặc biệt của cây nhị phân
A B
C D
b A
C B
E
d
c c, d) Cây nhị phân
Cây zic- zắc
Trang 6Một số dạng đặc biệt của cây nhị phân (tiếp)
Cây nhị phân gần đầy
A
C
G H
B E J
D
F Cây nhị phân đầy đủ
Trang 7II BIỂU DIỄN CÂY NHỊ PHÂN
1 Lưu trữ kế tiếp
Cây nhị phân đầy đủ:
- Đánh số cho các nút trên cây theo thứ tự lần lượt từ mức 1 trở lên, hết mức này đến mức khác, từ trái sang phải đối với mỗi mức
Ví dụ: Đánh số cây ở hình dưới như sau:
Trang 81 Lưu trữ kế tiếp (tiếp).
Vậy với cây trên ta sẽ có
A B C D E F G V[1] V[2] V[3] V[4] V[5] V[6] V[7]
Trang 91 Lưu trữ kế tiếp (tiếp).
Nhận xét:
- Với cây nhị phân hoàn chỉnh mà các nút ở mức cuối đều dạt về phía trái thì cách lưu trữ này vẫn phù hợp
-Các cây nhị phân khác thì cách lưu trữ này gây lãng phí do có nhiều phần tử bị bỏ trống
-Do cây luôn biến động ( thêm, bớt các nút) nên cách lưu trữ này rất khó khăn cho các thao tác đó
Trang 102 Lưu trữ móc nối
Mỗi nút gồm:
Trong đó:
Left: Ứng với con trỏ, trỏ tới cây
con trái của nút đó
Right:Ứng với con trỏ, trỏ tới cây
con phải của nút đó
Infor: Thông tin của nút.
Key: Khoá của nút.
Left Infor Key Right
Item
Trang 11D
C
F E
H I G
T
Trang 12Khai báo cây (Dùng danh sách móc nối)
Left,Right: Search_Type;
End;
Trang 13III CÁC PHÉP DUYỆT CÂY NHỊ PHÂN
Duyệt theo thứ tự trước
(Gốc T → Cây con trái → Cây con phải)
Trang 14Cài đặt
Procedure T_T_truoc(T:Search_type); Begin
If T= Nil then write(‘Cay rong’) Else
Begin
Duyetgoc(T^.Node); T_T_truoc(T^.Left); T_T_truoc(T^.Right); End;
End;
Trang 15Duyệt theo thứ tự sau.
(Cây con trái → Cây con phải → Gốc T )
Cụ thể:
- Nếu cây T rỗng thì không làm gì
- Nếu cây T ≠ Nul thì:
+ Duyệt cây con trái của T (theo thứ tự sau)
+ Duyệt các cây phải của gốc T (theo thứ
tự sau)
+ Thăm gốc T
Trang 16C ài đặt
Procedure T_T_sau(T:Search_type);Begin
If T= Nil then write(‘Cay rong’) Else
Begin
T_T_sau(T^.Left);
T_T_sau(T^.Right);Duyetgoc(T^.Node);End;
End;
Trang 17Duyệt theo thứ tự giữa.
(Cây con trái → Gốc T → Cây con phải)
Trang 18C ài đặt
Procedure T_T_Giua(T:Search_type); Begin
Trang 19IV.MỘT SỐ THAO TÁC TRÊN CÂY NHỊ PHÂN
1. Trả ra một phần tử có khoá đã biết.
2. Chèn một phần tử vào cây nhị phân
3. Xoá một phần tử khỏi cây nhị phân
Trang 20While (temp <>Nil) and (Tem^.Item.key<>k) Do
If Tem^.Item.key > k then Temp:=Temp ^.Left Else Temp:= Temp ^ Right
Phantu:= Temp;
End;
Trang 211 Trả ra một phần tử có khoá đã biết (tiếp)
Trang 222 Ch èn một phần tử vào cây nhị phân
Cách thực hiện:
- Tìm vị trí chèn.
- Thực hiện chèn Thuật toán:
-Nếu cây rỗng thì chèn vào gốc.
-Nếu khoá của phần tử mới < khoá của gốc thì chèn vào cây con trái.
-Nếu khoá của phần tử mới > khoá của gốc thì chèn vào cây con phải.
Trang 232 Chèn một phần tử vào cây nhị phân (tiếp)
If Tem^.Item.key = T ^.Item.key then Insert(newItem,T ^.right) Else Insert(NewItem ^.Right);
End;
Trang 243 Xoá một phần tử khỏi cây nhị phân
Trang 253 Xoá một phần tử khỏi cây nhị phân (tiếp)
làm như sau
(1) Cho nút cha chỉ vào Nil
(2) Cho nút cha của nút cần xoá chỉ vào nút con của nút cần xoá.
(3) + Tìm phần tử lớn nhất của cây con bên trái của nút đó hoặc phần tử nhỏ nhất của cây con bên phải.
+ Thay phần tử cần xoá bằng phần tử vừa tìm thấy.
+ Xoá phần tử đó ra khỏi cây
Trang 263 Xoá một phần tử khỏi cây nhị phân (tiếp)
Mã hoá
Procedure Delete(k:key_Type; Var T: search_Type);
Begin
If k < T ^.Item.key then Delete(x,T ^.Left)
Else If x > T ^.Item.key then Delete(x, T ^.Right)
Else If T ^.Left=Nil then T:= T ^.Right
Else
If T ^.Right = Nil then T:= T ^.Left Else
Begin Temp:= T ^.Left;
While Temp ^.Right <> Nil Do Temp:= Temp ^.Right;
T ^.Item:=Temp ^.Item;
Delete(Temp ^.Item.key,T ^.Left);
End;
End;
Trang 27CÂU HỎI VÀ BÀI TẬP
thức sau đây và viết chúng dưới dạng tiền
tố, hậu tố
a) (a * b + c)/(d – e * f)
b) A /(B + C) + D * E – A * C
Trang 28Bài 2: Cho cây nhị phân
Hãy viết các nút được thăm khi duyệt cây này:
Trang 29Bài 3: Cho cây nhị phân
Hãy minh hoạ phần bộ nhớ khi thực hiện lưu trữ kế tiếp đối với cây trên
A
C
F I
B
D H
Trang 30Bài 4: Tìm cây nhị phân mà các nút sẽ xuất hiện theo một dãy giống nhau khi duyệt:
a Theo thứ tự trước và thứ tự giữa.
b Theo thứ tự trước và thứ tự sau.
c Theo thứ tự giữa và thứ tự sau.