GIỚI THIỆU THÀNH VIÊN- 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
Trang 1SLIDE POWERPOINT Nhóm: 14
Môn: CTDL & GT Giảng Viên: Trần Anh Tuấn
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 2GIỚI THIỆU THÀNH VIÊN
- 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
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 401 Khái niệm
Một số tính chất của cây nhị phân 02
03 Biểu diễn cây nhị phân
Duyệt cây nhị phân
05 Biểu diễn cây tổng quát bằng cây nhị
phân
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 5- 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.
Khái Niệm 01 - Nút lá là nút không có nút con nào.
- 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ữ
- 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.
liệu tuyến tính, cây là cấu trúc dữ liệu phân cấp.
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 6- Lưu trữ thông tin tạo thành một hệ thống phân cấp một cách tự nhiên
- Cung cấp khả năng truy cập, tìm kiếm vừa phải (nhanh hơn danh
sách liên kết và chậm hơn so với mảng)
hơn danh sách liên kết không có thứ tự)
- Không có giới hạn về số lượng nút vì các nút được liên kết bằng cách sử dụng con trỏ (giống danh sách liên kết và không giống mảng).
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 7Các dạng cây nhị phân đặc biệt 02
Trang 8Cá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ốicù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
02
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 9Thao táo dữ liệu phân cấp
Làm cho thông tin dễ dàng tìm kiếm
Thao tác với danh sách dữ liệu đã được sắp xếp
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
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 10Biểu diễn cây nhị phân
Có 2 cách biểu diễn:
-Biểu diễn cây nhị phân bởi mảng -Biểu diễn cây nhị phân bằng con trỏ
Trang 11TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 12Biể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
03 mảng này
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 14TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 16Biể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
03
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 18Cú Pháp Biểu Diễn
typedef struct Node
{
item Infor;
Node *pLeft; // con trỏ đến nút con trái
Node *pRight; // con trỏ đến nút con phải
}
typedef struct Node *bTree2
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 1903 Các phép toán cơ bản trên cây nhị phân
1- Tạo cây rỗng2- Kiểm tra cây rỗng3- Xác định con trái của một nút được trỏ bởi p4- Xác định con phải của một nút được trỏ bởi p5- Kiểm tra nút lá
6- Xác định số nút của cây
8- Tìm một đỉnh có khóa x trên cây
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 212- 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 trabiến T có bằng NULL không
Trang 223- 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ònnếu cây rỗng thì trả về giá trị NULL
bTree2 leftChild(bTree2 T)
{
if ( T!=NULL ) return T->left;
else return NULL;
}
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 246- 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)
Trang 257- 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
bTree2 create2(Tdata x, bTree2 a, bTree2 b)
Trang 268- 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ếunú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ằngNULL ( 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ộidung 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ántì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 đó
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 27Duyệt
cây nhị
phân
Duyệ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
04gố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 28TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 29Duyệ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 30TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 31Duyệt tiền thứ tự trong cây nhị phân:
04
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){
Trang 32Duyệ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 33Duyệt trung thứ tự trong cây nhị phân:
04
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){
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 34Duyệ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 35Duyệt hậu thứ tự trong cây nhị phân:
04
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 << " " ; }
}
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 36Biểu diễn cây tổng quát bằng cây nhị
phân
- Sơ lược về cây tổng quát
- Biểu diễn cây
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 37Sơ lược:
Khái niệm: Cây tổng quát là những cây mà trong đó số lượng cây con của của mỗi
nút không cố định Trong thực tế có một số cấu trúc dạng cây tổng quát như:
cấu trúc thư mục trên ổ đĩa hay mục lục của 1 cuốn sách
05
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 38- 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ố con05
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
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
a) Mô tả dạng biểu diễn
Trang 39a) Mô tả dạng biểu diễn
05
- 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
EldestChild Infor 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ỉ.
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 40b) 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.
05
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 41b) Thuật toán
05
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 42* Ta cũng có thể hiểu một cách trực quan hơn bằng 1
+ 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.
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 44Cú Pháp Biểu Diễn
typedef <kiểu_dữ_liệu> Item;
typedef struct Node // Cấu trúc của Node
{ Item Infor ; Node
Trang 45Câu hỏi?
Câu 1: Tại sao sử dụng cây nhị phân?
Câu 2: Có mấy phương pháp cài đặt cây nhị phân? Ưu
và 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?
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 46Thời Gian: 10 phút
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 47Tạ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ênviệc sử dụng cây nhị phân để lưu giữ và tìm kiếm thông tin vẫn là mộttrong những áp dụng quan trọng nhất của cây nhị phân Trong bài viếtnà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
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 48Có mấy phương pháp cài đặt cây nhị phân? Ưu
và nhược điểm từng cách
-Có 2 phương pháp cài đặt cây nhị phân
a) Cài đặt bởi mảng: - Ưu điểm:
+ 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ỏ:
- Ưu điểm:
+ Không có hiện tượng dư thừa bộ nhớ
- Hạn chế:
+ Truy cập đến các phần tử trên cây là truy cập tuần tự, bao giờ cũng xuất phát từ gốc, nên tốc độ
truy cập là chậm TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 49Duyệ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)
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 50Tạ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.
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 51Câ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.
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 52Thời Gian: 20 phút
TIEU LUAN MOI download : skknchat123@gmail.com moi nhat
Trang 53THANKS FOR LISTENING
Trang 54TIEU LUAN MOI download : skknchat123@gmail.com moi nhat