TRẦN HỮU THANH THIÊN - Soạn Word- Chuẩn bị nội dung: Một số tính chất của cây nhị phân - Thuyết trình phần: Một số tính chất của cây nhị phân - Chuẩn bị nội dung: Biểu diễn cây nhị phân
Trang 1Nhóm: 14
Môn: CTDL & GT
Giảng Viên: Trần Anh Tuấn
Trang 2TRẦN HỮU THANH THIÊN - Soạn Word
- Chuẩn bị nội dung: Một số tính chất của cây nhị phân
- Thuyết trình phần: Một số tính chất của cây nhị phân
- Chuẩn bị nội dung: Biểu diễn cây nhị phân
- Thuyết trình phần: Biểu diễn cây nhị phân
- Chuẩn bị nội dung: Duyệt cây nhị phân
- Thuyết trình phần: Duyệt cây nhị phân
- Chuẩn bị nội dung: Biểu diễn cây tổng quát bằng cây nhị phân
- Thuyết trình phần : Biểu diễn cây tổng quát bằng cây nhị phân
Trang 3Nhị Phân(binary tree)
Trang 401
02 03
04 05
Khái niệm Một số tính chất của cây nhị phân
Biểu diễn cây nhị phân Duyệt cây nhị phân
Biểu diễn cây tổng quát bằng cây nhị phân
Trang 501
Khái Niệm
- Cây nhị phân là tập hợp các nút (node) chứa giá trị liên kết với nhau theo quan
hệ cha - con (lần lượt theo chiều mũi tên như hình vẽ) sao cho mỗi nút không quá 2 nút con.
- Nút gốc là nút không là con của bất kỳ của nút nào, là nút bắt đầu của cây nhị phân, từ đó cây nhị phân mở rộng ra.
- Nút trong là nút có con, bất kể 1 hoặc 2 nút con.
- Nút lá là nút không có nút con nào.
- Mỗi nút trong cây cùng với những nút phía dưới nó tạo thành một cây con.
- Không giống như Mảng, Danh sách liên kết, Ngăn xếp và hàng đợi, là cấu trúc dữ liệu tuyến tính, cây là cấu trúc dữ liệu phân cấp.
Trang 802
Các dạng cây nhị phân suy biến
- Cây nhị phân hoàn chỉnh: Các nút ứng với các mức trừ mức gần mức cuối cùng đều có 2 con
- Cây nhị phân đầy đủ: Các nút có bậc tối đa ở mọi mức kể cả mức gần mức cuối cùng
Trang 9Các ứng dụng chính của cây
Làm cho thông tin dễ dàng tìm kiếm
Là một quy trình làm việc để tổng hợp các hình ảnh kỹ thuật số cho các hiệu ứng hình ảnh
Thao tác với danh sách dữ liệu đã được sắp xếp
Các thuật toán của bộ định tuyến
Hình thức ra quyết định nhiều giai
đoạn
Thao táo dữ liệu phân cấp
Trang 1103
03
Biểu diễn cây nhị phân bởi mảng
- Mô tả dạng biểu diễn:
• Cây sau khi biểu diễn được xem như một mảng các nút (đỉnh)
• Mỗi nút (đỉnh) là một bản ghi gồm 3 trường: info, left, right
Info: lưu giá trị của đỉnh Left: con trái của đỉnh (lưu ID) Right: con phải của đỉnh (lưu ID)
Thực hiện các thao tác trên cây là thực hiện các thao tác trên mảng này
Trang 12F
1 2
Trang 13Cú Pháp Biểu Diễn
#define N <MaxNode>
typedef struct {
Trang 1403
03
Biểu diễn cây nhị phân con trỏ
Ngoài cách cài đặt cây nhị phân bởi mảng, chúng ta còn có thể sử
dụng con trỏ để cài đặt cây nhị phân Trong cách này mỗi bản ghi
biểu diễn một đỉnh của cây chứa hai con trỏ: con trỏ trái (left) trỏ tới đỉnh con trái, con trỏ phải (right) trỏ tới đỉnh con phải
Trang 15A
C
E D
Trang 16typedef struct Node *bTree2
Trang 176- Xác định số nút của cây 7- Tạo cây mới từ hai cây có sẵn 8- Tìm một đỉnh có khóa x trên cây
Trang 192- Kiểm tra cây rỗng
Để kiểm tra có phải cây rỗng hay không ta chỉ cần kiểm tra xem trên cây có nút nào không, nếu không trả về True ngược lại trả về False Ở đây ta kiểm tra biến
Trang 203- Xác định con trái của một nút
Để xác định con trái của một nút bất kỳ trên cây đầu tiên ta kiểm tra xem cây có rỗng hay không, nếu cây khác rỗng thì trả về nút con trái của nút cần tìm còn nếu cây rỗng thì trả về giá trị NULL
bTree2 leftChild(bTree2 T)
{
if ( T!=NULL ) return T->left;
else return NULL;
}
Trang 226- Xác định số nút của cây
Để xác định số nút của cây ta thực hiện như sau: kiểm tra cây, nếu cây rỗng thì không có nút nào trên cây, nếu cây khác rỗng thì trả về số nút trên cây bằng 1 (nút gốc) cộng với số nút của cây con bên trái và cộng với số nút của cây con bên phải
Int numberNodes (bTree2 T)
{
if ( emptyTree(T) ) return 0;
else return 1+numberNodes (leftChild(T))+ numberNodes (rightChild(T));
}
Trang 237- Tạo cây mới từ hai cây có sẵn
Cho hai cây con a, b và x là giá trị bất kì Hãy tạo một cây nhị phân có gốc lưu x
và a, b là hai cây con trái, phải của gốc này
Cách giải: + Yêu cầu máy tính cấp phát bộ nhớ để làm gốc của cây
+ Đổ x vào ngăn data của ô nhớ vừa cấp phát
+ Gắn a, b tương ứng vào nhánh trái, phải của gốc
Trang 248- Tìm nút có nội dung là x trên cây nhị phân
Để tìm nút có nội dung x trên cây nhị phân ta tiến hành kiểm tra từ nút gốc, nếu nút gốc có nội dung là x thì nút gốc chính là nút cần tìm Nếu nút gốc bằng NULL ( cây rỗng ) thì không có nút nào có nội dung là x trên cây Nếu nội dung nút gốc khác x và nút gốc khác NULL thì ta lần lượt thực hiện phép toán tìm kiếm trên nhánh cây con bên trái và cây con bên phải của cây đó
Trang 25• Duyệt tiền thứ tự (Pre-order Traversal)
• Duyệt trung thứ tự (In-order Traversal)
• Duyệt hậu thứ tự (Post-order Traversal)
Trang 26Duyệt tiền thứ tự trong cây nhị phân:
Trong cách thức duyệt tiền thứ tự trong cây nhị phân, nút gốc được duyệt đầu tiên, sau đó sẽ duyệt cây con bên trái và cuối cùng sẽ duyệt cây con bên phải.
Trang 27Duyệt tiền thứ tự trong cây nhị phân:
Duyệt cho tới khi tất cả các nút đều được duyệt:
Bước 1: Truy cập nút gốc.
Bước 2: Duyệt các cây con bên trái một cách đệ qui.
Bước 3: Duyệt các cây con bên phải một cách đệ qui.
Code mẫu của in cây theo cách duyệt tiền thứ tự:
void printTree (node *t){
04
Trang 28Duyệt trung thứ tự trong cây nhị phân:
Nếu một cây nhị phân được duyệt trung thứ tự, kết quả tạo ra sẽ là các giá trị khóa được sắp xếp theo thứ tự tăng dần.
Trang 29Duyệt trung thứ tự trong cây nhị phân:
Duyệt cho tới khi tất cả các nút đều được duyệt:
Bước 1: Duyệt các cây con bên trái một cách đệ qui.
Bước 2: Truy cập nút gốc.
Bước 3: Duyệt các cây con bên phải một cách đệ qui.
Code mẫu việc in cây theo duyệt trung thứ tự:
void printTree (node *t){
04
Trang 30Duyệt hậu thứ tự trong cây nhị phân:
Trong cách thức duyệt hậu thứ tự trong cây nhị phân, nút gốc của cây sẽ được truy cập cuối cùng, do đó bạn cần chú ý Đầu tiên, chúng ta duyệt cây con bên trái, sau đó sẽ duyệt cây con bên phải và cuối cùng là duyệt nút gốc.
Trang 31Duyệt hậu thứ tự trong cây nhị phân:
Duyệt cho tới khi tất cả các nút đều được duyệt:
Bước 1: Duyệt các cây con bên trái một cách đệ qui.
Bước 2: Duyệt các cây con bên phải một cách đệ qui.
Bước 3: Truy cập nút gốc.
Code mẫu của in cây theo cách duyệt tiền thứ tự:
void printTree (node *t){
if (t != NULL ){
printTree (t->left);
printTree (t->right);
cout << t->data << " " ; }
}
04
Trang 32- Sơ lược về cây tổng quát
- Biểu diễn cây
Trang 3405
a) Mô tả dạng biểu diễn
- Khi biểu diễn cấu trúc cây tổng quát, vì mỗi nút có thể có nhiều con, số con lại khác nhau, vì vậy ta không nên dùng cho mỗi nút con liên kết đến nút cha
mà với mỗi nút vẫn chỉ dành hai liên kết, một liên kết (trường EldestChild)
trỏ đến nút con đầu bên trái của nó, một liên kết (trường NextSibling) trỏ đến nút cùng cha kề bên phải của nó Nếu coi liên kết EldestChild như liên kết
Left, liên kết NextSibling như liên kết Right thì ta được một cây nhị phân
tương đương với cây tổng quát.
Trang 3505
a) Mô tả dạng biểu diễn
- Khi đó, mỗi nút của cây có thể xem như 1 cấu trúc bản ghi gồm 3 trường: Infor,
EldestChild, NextSibling
+ Infor: chứa dữ liệu của nút
+ EldestChild: trỏ tới nút con đầu, trong trường hợp trỏ tới nút lá thì sẽ gán vào giá
trị Null.
+ NextSibling: trỏ tới nút cây cùng cha liền kề, trong trường hợp không có nút liền
kề thì cũng gán vào giá trị Null.
- Các nút trên cây được tổ chức lưu trữ móc nối thông qua cơ chế lưu địa chỉ.
EldestChild Infor NextSibling
Trang 3605
b) Thuật toán
- Sử dụng gốc cây tổng quát làm gốc cây nhị phân
- Giữ lại các nút con trái nhất (con đầu) của mỗi nút cha trong cây tổng quát để làm nút con trái của cây nhị phân.
- Các nút con còn lại được chèn làm nút con phải của nút bên trái liền kề nó.
- Lặp lại như vậy để hoàn thành cây cho mỗi nút.
Trang 3705
b) Thuật toán
Trang 38+ Lấy nút ngay bên phải trên cùng một đường
ngang của nút đã chọn để làm nút phải
1
2 3 4 5
11 10
9 8
7 6
05
Trang 391 2
9 6
05
Trang 40Cú Pháp Biểu Diễn
typedef <kiểu_dữ_liệu> Item;
typedef struct Node // Cấu trúc của Node
Trang 41Câu hỏi?
Câu 1: Tại sao sử dụng cây nhị phân?
nhược điểm của từng cách
Câu 3: Duyệt cây là gì?
Câu 4: Tại sao cần biểu diễn cây tổng quát bằng cây nhị phân?
Trang 42Thời Gian: 10 phút
Trang 43Tại sao sử dụng cây nhị phân?
Cây nhị phân được sử dụng vào nhiều mục đích khác nhau Tuy nhiên việc sử dụng cây nhị phân để lưu giữ và tìm kiếm thông tin vẫn là một trong những áp dụng quan trọng nhất của cây nhị phân Trong bài viết này đề cập lớp cây nhị phân phục vụ cho việc tìm kiếm thông tin, đó là cây nhị phân tìm kiếm.
Trang 44+ Các phép toán thực hiện tương đối dễ dàng
+ Việc truy cập đến các đỉnh trên cây là trực tiếp, tốc độ truy cập là nhanh và đồng đều đối với mọi phần tử
- Hạn chế:
+ Khi cài đặt gây hiện tựợng dư thừa bộ nhớ
b) Cài đặt bởi con trỏ:
Trang 45Duyệt cây là gì?
Duyệt cây là một tiến trình để truy cập tất cả các nút của một cây và cũng có thể in các giá trị của các nút này Bởi vì tất cả các nút được kết nối thông qua các cạnh (hoặc các link), nên chúng ta luôn luôn bắt đầu truy cập từ nút gốc Do đó, chúng ta không thể truy cập ngẫu nhiên bất kỳ nút nào trong cây Có ba phương thức mà chúng ta có thể sử dụng để duyệt một cây:
Duyệt tiền thứ tự (Pre-order Traversal)
Duyệt trung thứ tự (In-order Traversal)
Duyệt hậu thứ tự (Post-order Traversal)
Trang 46Tại sao cần biểu diễn cây tổng quát bằng cây nhị phân?
Nhược điểm của các cấu trúc cây tổng quát:
- Bậc của các nút trên cây có thể dao động trong một biên độ lớn khiến việc biểu diễn gặp khó khăn và lãng phí
- Các thao tác trên cây tổng quát phức tạp hơn cây nhị phân rất nhiều.
Vì vậy, khi không quá cần thiết phải sử dụng cây tổng quát, người ta thường chuyển cây tổng
quát thành cây nhị phân Sau khi chuyển thành cây nhị phân tương đương, ta có thể lưu trữ bằng danh sách liên kết và thực hiện các thao tác như với cây nhị phân.
Trang 47Câu hỏi?
Bài 1 Kiểm tra hai cây nhị phân có giống nhau hay không:
Viết một chương trình in ra hai cây nhị phân, sau đó so sánh chúng có giống nhau hay không (tức là so sánh cả cấu trúc và nội dung) và in kết quả ra màn hình.
Bài 2 Xóa 1 cây nhị phân:
Viết chương trình xóa 1 cây nhị phân bằng cách xóa phân bổ mọi nút đơn trong cây mà không thay đổi tham chiếu của nút gốc thành null.
Trang 48Thời Gian: 20 phút
Trang 49Cay.Nhi.Phan.(binary.tree).Mot.so.tinh.chat.cua.cay.nhi.phan.Bieu.dien.cay.nhi.phan.Bieu.dien.cay.tong.quat.bang.cay.nhi.phanCay.Nhi.Phan.(binary.tree).Mot.so.tinh.chat.cua.cay.nhi.phan.Bieu.dien.cay.nhi.phan.Bieu.dien.cay.tong.quat.bang.cay.nhi.phanCay.Nhi.Phan.(binary.tree).Mot.so.tinh.chat.cua.cay.nhi.phan.Bieu.dien.cay.nhi.phan.Bieu.dien.cay.tong.quat.bang.cay.nhi.phanCay.Nhi.Phan.(binary.tree).Mot.so.tinh.chat.cua.cay.nhi.phan.Bieu.dien.cay.nhi.phan.Bieu.dien.cay.tong.quat.bang.cay.nhi.phan