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 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
Trang 3Nhị Phân
(binary tree)
Trang 402 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 5Khá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 7Các dạng cây nhị phân đặc biệt
- Cây lệch trái
- Cây lệch phải
- Cây zic-zắc
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ố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
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 đỉnhLeft: 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 12Ví dụ:
A
C
E D
B
F
1 2
Trang 1403
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 15C
E D
Trang 16Cú 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
Trang 1703
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ây7- Tạo cây mới từ hai cây có sẵn8- 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 32Biểu diễn
Biể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
Trang 33Sơ 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
Trang 34a) 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 35a) 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 36b) 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 37b) Thuật toán
Trang 38* Ta cũng có thể hiểu một cách trực quan hơn bằng
+ 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
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 44Có 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ỏ:
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 49THANKS FOR LISTENING