4.1.7 Phép duyệt cây Là phép thăm các nút trong cây một cách hệ thống sao cho tất cả các nút đều được thăm và được thăm đúng một lần Có 3 cách duyệt cây cơ bản : Duyệt cây theo th
Trang 1Chương 4
CẤU TRÚC CÂY
Trang 2NỘI DUNG
Các khái niệm cơ bản
Cây nhị phân
Cây tổng quát
Trang 34.1 CÁC KHÁI NIỆM CƠ BẢN
Định nghĩa cây
Cấp của cây
Mức của cây
Đường đi và độ dài đường đi trong cây
Độ cao, độ sâu của nút trong cây
Thứ tự các nút trong cây
Phép duyệt cây
Trang 44.1.1 Định nghĩa cây
Cây là tập hợp hữu hạn các nút trong đó có một nút đặc biệt gọi là gốc của cây(root) Các nút có mối quan hệ
phân cấp gọi là quan hệ ‘’cha-con’’
Định nghĩa đệ qui về cây
Một nút là một cây gốc của cây chính là nút đó.
Giả sử T 1 , T 2 , …, T n (n ≥ 1) là các cây có gốc tương
ứng r 1 , r 2 ,…, r n Khi đó cây T với gốc r được hình thành bằng cách cho r trở thành nút cha của các nút r 1 , r 2 ,
…, r n
Trang 64.1.2 Cấp của cây
Cấp của nút trong cây là số con của nút
Cấp của cây: Là cấp cao nhất của nút có trong cây.
Cây có cấp n thì gọi là cây n - phân
Trang 74.1.3 Mức của cây
Gốc của cây có mức là 1
Cha có mức là i thì con có mức là i+1
Mức của cây là mức cao nhất của nút có trong cây
Trang 84.1.4 Đường đi và độ dài đường đi
Dãy các nút n 1 , n 2 , , n k được gọi là một đường đi trong cây T nếu n i là cha của n i+1 (1 ≤ i < k) có độ dài là k-1
Nếu có một đường đi từ A đến B trong cây T thì A được gọi là tiền thân của B, B được gọi là hậu thế của A
Trong một cây, gốc là nút không có tiền thân, lá là nút không có hậu thế
Trang 94.1.5 Độ cao và độ sâu của nút
Độ cao của một nút trong cây là số nút trong đường đi dài nhất từ nút đó tới lá
Độ cao của cây là độ cao của nút gốc
Độ sâu của một nút trong cây là số nút trong đường đi
từ gốc tới nút đó
Trang 104.1.6 Thứ tự các nút trong cây
Trong cây nếu nút n có các con là n 1, n 2 , , n k thì
n i (1<=i<=k) là các nút anh em
n 1 là con bên trái cùng hay con trưởng
n k là con bên phải cùng hay con út
n i (1<=i<k) là anh em liền kề bên trái của n i+1
n i (1<i<=k) là anh em liền kề bên phải của n i-1
Trang 124.1.7 Phép duyệt cây
Là phép thăm các nút trong cây một cách hệ thống sao cho tất cả các nút đều được thăm và được thăm đúng một lần
Có 3 cách duyệt cây cơ bản :
Duyệt cây theo thứ tự trước (preorder)
Duyệt cây theo thứ tự giữa (inorder)
Duyệt cây theo thứ tự sau (postorder )
Trang 134.1.7 Phép duyệt cây
Duyệt cây theo thứ tự trước (preorder)
Nếu cây khác rỗng
Thăm gốc
Duyệt cây con trái cùng theo thứ tự trước
Duyệt các cây con còn lại theo thứ tự trước
Trang 154.1.7 Phép duyệt cây
Duyệt cây theo thứ tự sau (postorder)
Nếu cây khác rỗng
Duyệt cây con trái cùng theo thứ tự sau
Duyệt các cây con còn lại theo thứ tự sau
Thăm gốc
Trang 164.1.7 Phép duyệt cây
Thứ tự trước : ABEFGCHDIKThứ tự giữa : EBFGAHCIDKThứ tự sau : EFGBHCIKDA
A
K I
H G
F E
Trang 174.1.8 Cây gán nhãn và cây biểu thức
Cây gán nhãn : Mỗi nút trong cây được gán với một
nhãn
Cây biểu thức : Mỗi nút trong cây được gán với một
thành phần của biểu thức theo cách
Mỗi nút lá được gán với một toán hạng
Mỗi nút trong được gán với một toán tử
Trang 184.1.8 Cây gán nhãn và cây biểu thức
Ví dụ cây biểu thức P = a*(b - c) + d/e
Duyệt theo thứ tự trước : + * a - b c / d e
Duyệt theo thứ sau : a b c - * d e / +
Trang 194.1.8 Cây gán nhãn và cây biểu thức
Thuật toán định giá biểu thức dạng tiền tố
Khởi tạo : Sử dụng ngăn xếp rỗng
Bước 1 : Đọc từng thành phần của biểu thức tiền tố
Nếu là toán tử đẩy toán tử vào ngăn xếp Nếu là toán hạng xét phần tử đỉnh của ngăn xếp, nếu là toán tử thì đẩy toán hạng vào, nếu là toán hạng thì lấy ra cùng với một toán tử thực hiện phép toán rồi xét phần tử đỉnh.
Trang 204.1.8 Cây gán nhãn và cây biểu thức
a*kq1
=kq2
d / kq2 +
d/e
=kq3
kq2 +
e
kq2+kq3
=kq
Trang 214.2 CÂY NHỊ PHÂN
Khái niệm, đặc điểm, tính chất
Biểu diễn cây nhị phân
Cây nhị phân tìm kiếm
Trang 224.2.1 Khái niệm, đặc điểm, tính chất
Là dạng đặc biệt của cây Mỗi nút trong có tối đa 2 con, phân biệt con bên trái và con bên phải của nút
Là cây có thứ tự
Các dạng cây nhị phân đặc biệt
Cây nhị phân suy biến
Trang 234.2.1 Khái niệm, đặc điểm, tính chất
Các dạng cây nhị phân đặc biệt
Cây nhị phân hoàn chỉnh : Các mức đều đạt tối đa số nút trừ mức cao nhất trong cây
Trang 244.2.1 Khái niệm, đặc điểm, tính chất
Các dạng cây nhị phân đặc biệt
Cây nhị phân hoàn chỉnh đầy đủ : Các mức đều đạt tối
đa số nút
Trang 254.2.1 Khái niệm, đặc điểm, tính chất
Trong cây nhị phân
Số lượng nút tối đa ở mức i là 2 i-1
Số lượng nút tối đa ở cây nhị phân mức i 2 i – 1
Trong các cây nhị phân có cùng số nút thì cây nhị
phân suy biến có chiều cao lớn nhất, cây nhị phân
hoàn chỉnh, hoàn chỉnh đầy đủ có chiều cao nhỏ nhất
Trang 264.2.2 Biểu diễn cây nhị phân
Biểu diễn bằng mảng
Biểu diễn bằng con trỏ
Trang 274.2.2 Biểu diễn cây nhị phân
Biểu diễn bằng mảng : Dùng mảng một chiều
Trang 284.2.2 Biểu diễn cây nhị phân
C
D
Trang 294.2.2 Biểu diễn cây nhị phân
Biểu diễn bằng con trỏ
Mỗi nút trong cây là một bản ghi gồm có 3 trường
data chứa thông tin của nút
Trang 304.2.2 Biểu diễn cây nhị phân
Ví dụ
Nhận xét : Cây nhị phân có n nút thì có 2*n con trỏ
Trong đó n-1 con trỏ khác NULL
Trang 314.2.3 Cây nhị phân tìm kiếm
Định nghĩa, khai báo cấu trúc dữ liệu
Các phép toán cơ bản
Trang 32Định nghĩa cây nhị phân tìm kiếm
Là cây nhị phân đặc biệt dùng để lưu trữ và tìm kiếm
thông tin
Khóa của nút cha không nhỏ hơn khóa của nút con bên trái và không lớn hơn khóa của nút con bên phải
Trang 33Khai báo cấu trúc dữ liệu
struct node
{
<kiểu khóa> key ;
node *left, *right ;
Trang 34Các phép toán cơ bản
Khởi tạo cây t rỗng : creat(t)
Kiểm tra cây t rỗng : empty(t)
Chèn khóa x vào cây t : insert(x,t)
Loại khóa x trong cây t : del(x,t)
Duyệt cây t theo 3 cách duyệt cơ bản
Trang 35Các phép toán cơ bản
Khởi tạo cây t rỗng : creat(t)
void creat(node *&t)
{
t = NULL;
}
Trang 37Các phép toán cơ bản
Chèn khóa x vào cây t : insert(x,t)
void insert(<kiểu khóa> x, node *&t)
Trang 38Các phép toán cơ bản
Loại khóa x trong cây t
Nếu t->key== x
x
Trang 41q
Trang 43Các phép toán cơ bản
Nếu t->key!=x
if (t->key>x) del(x,t->left) ; else del(x,t->right);
!x
Trang 44Các phép toán cơ bản
Loại khóa x trong cây t : del(x,t)
void del(<kiểu khóa> x, node *&t)
{ node *p,*q,*s;
if (t!=NULL)
{ if (t->key==x)
if (t->left==NULL) { p=t; t =t->right; delete(p);}
else if (t->right==NULL) { p=t; t =t->left; delete(p);}
else
Trang 45Các phép toán cơ bản
else { p=t->left;
else if (t->key>x) del(x,t->left) ;
Trang 49Các phép toán cơ bản
Nhập cây nhị phân tìm kiếm
void nhap(node * &t)
{ int n,x ; t=NULL ; cout<<“Nhap so nut : ” ; cin>>n ; for (int i=1;i<=n;i++)
{ cout<<“Nhap nut thu “<<i<<“ : “ ; cin>>x ; insert(x,t)
Trang 504.3 CÂY TỔNG QUÁT
Các phương pháp biểu diễn cây tổng quát
Biểu diễn cây tổng quát bằng danh sách con của nút
Cài đặt bởi mảng
Cài đặt bởi con trỏ
Kết hợp mảng và con trỏ
Biểu diễn cây tổng quát bằng con trưởng và anh em liền
kề bên phải (Cây nhị phân tương đương)
Cài đặt bởi mảng
Cài đặt bởi con trỏ
Biểu diễn cây tổng quát theo cha của nút
Cài đặt bởi mảng
Trang 51BÀI TẬP ÁP DỤNG
Bài 1 - Tự cho các biểu thức số học Yêu cầu :
Dựng cây biểu thức
Viết biểu thức dưới dạng tiền tố, hậu tố
Mô tả tình trạng của ngăn xếp qua các bước định giá biểu thức dạng hậu tố, tiền tố
Trang 52BÀI TẬP ÁP DỤNG
Bài 2 - Cho danh sách các nút trong cây
Duyệt theo inorder : BDEFCHIGA
Duyệt theo postorder : FEDIHGCBA
Dựng cây nhị phân tương ứng
Duyệt theo preorder : ACDNFOPBEMK
Duyệt theo inorder : DNCOFPAEBKM
Dựng cây nhị phân tương ứng
Trang 53BÀI TẬP ÁP DỤNG
Bài 3 - Thực hiện các yêu cầu sau đối với cây nhị phân
tìm kiếm lưu các khóa là các số nguyên
Nhập cây nhị phân
Hiện cây theo 3 cách duyệt
Loại khóa x trong cây t
Tính tổng các nút trong cây t, tổng các nút âm chẵn,
Trang 54BÀI TẬP ÁP DỤNG
Bài 3 - (Tiếp)
Tráo đổi các nút trong cây t
Copy cây t vào cây t1
Xóa nút lớn nhất, xóa nút nhỏ nhất trong cây t
Tìm kiếm khóa x trong cây t