Root node: nút gốc: không có nút cha Leaf node: nút lá: không có nút con Internal node: nút trong: không phải nút con và nút gốc Height: chiều cao: khoảng cách từ gốc đến lá Par
Trang 4 Quan hệ one-to-many giữa các nút
Có duy nhất một đường đi từ gốc đến một nút
Các loại cây:
Nhị phân: mỗi nút có {0,1, 2} nút con
Tam phân: mỗi nút có {0,1,2,3} nút con
n-phân: mỗi nút có {0,1, ,n} nút con
Trang 6LF
AK
Q
Lá
nút gốc
Cạnh
Trang 7 Root node: nút gốc: không có nút cha
Leaf node: nút lá: không có nút con
Internal node: nút trong: không phải nút con và nút gốc
Height: chiều cao: khoảng cách từ gốc đến lá
Parent node (or ancestor, or superior): nút cha
Child nodes (successor): nút con
Trang 8Node E Node D
Node C
Node K Node J
Node L Node I
Trang 10 Cây nhị phân tìm kiếm
Cây nhị phân tìm kiếm cân bằng AVL
Trang 11 Cấu trúc cây đơn giản nhất
Tại mỗi nút gồm các 3 thành phần
Phần data: chứa giá trị, thông tin…
Liên kết đến nút con trái (nếu có)
Liên kết đến nút con phải (nếu có)
Cây nhị phân có thể rỗng (ko có nút nào)
Cây NP khác rỗng có 1 nút gốc
Có duy nhất 1 đường đi từ gốc đến 1 nút
Nút không có nút con bên trái và con bên phải là nút lá
Trang 13 Nút gốc và nút trung gian có đúng 2 con
Cây nhị phân đúng có n nút lá thì số nút trên cây 2n-1
A
Trang 14 Cây nhị phân đầy đủ với chiều sâu d
Phải là cây nhị phân đúng
Trang 15 Do cây là cấu trúc phi tuyến tính
3 cách duyệt cây nhị phân
A
Trang 19Biến parent dùng để lưu trữ chỉ số của nút cha.
Biến data dùng để lưu trữ thông tin của nút đó
Một biến maxNode để giữ số nút hiện tại đang có trên cây
Trang 20 hàm PARENT(n,T) tốn chỉ một hằng thời gian để lấy ra cha của nút n trong cây T.
Các hàm đòi hỏi thông tin về các con không làm việc tốt vì phải tốn vòng lặp để dò tìm
Tìm nút con trái nhất của nút i là không thể xác định được
Cách khắc phục qui ước cách đánh thứ tự như sau:
Đánh số theo thứ tự tăng dần bắt đầu tại nút gốc
Nút cha được đánh số trước các nút con
Các nút con cùng một nút cha được đánh số lần lượt từ trái sang phải
Trang 21Cài đặt cây: bằng danh sách con
Mỗi nút có 1 danh sách các nút con
Danh sách có thể được cài đặt bằng bất cứ cách nào ta biết Tuy nhiên dùng danh sách liên kết sẽ thích hợp hơn vì
số nút con ta chưa biết trước
Nhận xét:
Hàm đòi hỏi thông tin về các con làm việc rất thuận lợi
Hàm PARENT, Root lại không làm việc tốt Nó đòi hỏi ta phải duyệt tất cả các danh sách chứa các nút con
Trang 23 Các cấu trúc đã dùng để mô tả cây ở trên không trợ giúp phép tạo một cây lớn từ các cây nhỏ hơn (createI)
Ta thay thế mảng các header bằng mảng CELLSPACE chứa các struct có ba trường:
LABELS giữ nhãn của nút
LEFTMOST_CHILD là nút con trái nhất của nó
RIGHT_SIBLING là nút anh ruột phải
Hơn nữa mảng này giữ tất cả các nút của tất cả các cây
23
Cài đặt cây: theo con trái nhất và anh em ruột phải
Trang 24pTree
Trang 31II. visit root
III. For each remain child k of root
InOrder(k)
Thứ tự: C B A F E D
A
D B
Trang 35 Xác định độ sâu/chiều cao của cây
Tìm giá trị nhỏ nhất/lớn nhất trên cây
Tính tổng các giá trị trên cây
Đếm số nút có giá trị bằng x
Trang 36 Cây nhị phân (Binary Tree)
Cây nhị phân tìm kiếm (Binary Search Tree)
Cây nhị phân tìm kiếm cân bằng AVL
Trang 37 BST là cây nhị phân mà mỗi nút thoả
Giá trị của tất cả nút con trái < nút gốc
Giá trị của tất cả nút con phải > nút gốc
Trang 38Binary search trees
Non-binary search tree
25 45
Trang 42 Thời gian tìm kiếm
Dựa trên chiều cao của cây
Trang 43Nếu nút = NULL => ko tìm thấy
Nếu khoá x = khóa nút gốc => tìm thấy
Ngược lại nếu khoá x < khoá nút gốc => Tìm trên cây bên trái
Ngược lại => tìm trên cây bên phải
Trang 44 Giá trị nhỏ hơn ở bên cây con trái
Giá trị lớn hơn ở bên cây con phải
Trang 45 Thực hiện tìm kiếm giá trị x
Tìm đến cuối nút Y (nếu x ko tồn tại trong cây)
Nếu x < y, thêm nút lá x bên trái của Y
Nếu x > y, thêm nút lá x bên phải của Y
Trang 46 Delete: xóa nhưng phải đảm bảo vẫn là cây BST
Thực hiện tìm nút có giá trị x
Nếu nút là nút lá, delete nút
Ngược lại
Y là nút lớn nhất của cây con bên trái
Z là nút nhỏ nhất của cây con bên phải
Trang 47 Trường hợp 1: nút p là nút lá, xoá bình thường
Trang 48 Trường hợp 2: p chỉ có 1 cây con, cho nút cha của p trỏ tới nút con duy nhất của nó, rồi hủy p
Trang 49 Trường hợp 3: nút p có 2 cây con, chọn nút thay thế theo 1 trong 2 cách như sau
Nút lớn nhất trong cây con bên trái
Nút nhỏ nhất trong cây con bên phải
Nút lớn bên trái
Nút nhỏ bên phải
Trang 52 Minh họa xóa (25)
Trang 53 Minh họa xóa (25)
Trang 54 Minh họa xóa (25)
Trang 55 Minh họa xóa (25)
Trang 56 Minh họa xóa (25)
Trang 62 Nếu T = NULL ⇒ thoát
Nếu T->info > x ⇒ Remove(T->left, x)
Nếu T->info <x ⇒ Remove(T->right, x)
Nếu T->info = x
P = T
Nếu T có 1 nút con thì T trỏ đến nút con đó
Ngược lại có 2 con
Gọi f = p và rp = p->right;
Tìm nút rp sao cho rp->left = null và nút f là nút cha nút rp
Thay đổi giá trị nội dung của T và rp
Nếu f = p (trường hợp đặc biệt) thì: f->right = rp->right;
Ngược lại: f->left = rp->right;
P = rp; // p trỏ tới rp để xoá
Xoá P
Trang 631. Cài đặt cấu trúc dữ liệu liên kết cho cây nhị phân tìm kiếm
2. Cài đặt các thao tác xây dựng cây: NewNode, Init, IsEmpty, CreateNode
3. Cài đặt thao tác cập nhật: Insert, Remove, ClearTree
4. Xuất danh sách tăng dần và giảm dần
5. Kiểm tra xem cây có phải là cây nhị phân đúng
6. Kiểm tra xem cây có phải là cây nhị phân đầy đủ
7. Xác định nút cha của nút chứa khoá x
8. Đếm số nút lá, nút giữa, kích thước của cây
9. Xác định độ sâu/chiều cao của cây
10. Tìm giá trị nhỏ nhất/lớn nhất trên cây
11. Tính tổng các giá trị trên cây
Trang 65 Cây nhị phân tìm kiếm
Các phép toán: Create, Insert, Delete (remove)