Chương 5
Cây
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 1
Nội dung
Ðịnh nghĩa các thuật ngữ.
Các phép duyệt cây.
Một số ứng dụng của cây.
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 2
Các định nghĩa
Định nghĩa cây
f Cây
(tree) là một tập hợp gồm nhiều phần tử,
mỗi phần tử được gọi là nút (node), trong đó:
y
y
Một nút được gọi là nút gốc (root).
Các nút còn lại được chia thành m ≥ 0 nhóm,
mỗi nhóm là một cây và được gọi là cây con
(subtree).
f Một
cây không có nút nào cả được gọi là cây
rỗng.
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 3
Các định nghĩa
Bậc của nút và bậc của cây
f Bậc
của nút là số cây con của nút này.
f Bậc của cây là bậc lớn nhất của tất cả các
nút.
f Một cây có bậc n được gọi là cây n-phân (narity tree).
f Cây nhị phân là cây có bậc bằng 2.
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 4
Các định nghĩa
Nút trung gian và nút lá
f Nút
trung gian là nút có bậc khác 0 và không
là nút gốc.
f Nút lá là nút có bậc bằng 0 và không là nút
gốc.
Mức của nút và chiều cao của cây
f Mức
của nút gốc bằng 1.
f Mức của nút khác nút gốc bằng mức của nút
gốc của cây con nhỏ nhất chứa nút này cộng
1.
f Chiều cao của cây là mức lớn nhất của tất cả
các nút lá.
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 5
Các định nghĩa
Nút trước và nút sau
f Nút
y là nút trước của nút x nếu nút y là gốc
của cây có chứa nút x; nút x được gọi là nút
sau của nút y.
Nút cha, nút con và nút anh em
f Nút
y là nút cha của nút x nếu nút y là nút
trước của nút x và mức của nút x bằng mức
của nút y cộng 1; nút x được gọi là nút con
của nút y.
f Nút x và nút y là hai nút anh em nếu chúng có
cùng nút cha.
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 6
Các định nghĩa
Mức 1
A
Mức 2
Mức 3
Mức 4
B
C
G
H
D
E
I
F
Bậc của A là 2, bậc của C là 0.
Cây gốc A là cây nhị phân (bậc 2)
A là nút gốc, là nút cha của B, là nút trước của D, có mức bằng 1.
B là nút trung gian, là nút con của A, có mức bằng 2.
C là nút là, là nút anh em với D.
Chiều cao của cây gốc A bằng 4.
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 7
Các phép duyệt cây
Phép duyệt cây là quá trình đi đến tất cả
các nút của cây.
f Nhiều
bài toán trên cây được giải quyết bằng
phép duyệt cây (dùng giải thuật đệ quy vì cây
có cấu trúc đệ quy).
f Ký hiệu:
y
y
y
N là nút gốc.
L là cây con bên trái.
R là cây con bên phải.
Phép duyệt thứ tự đầu: NLR và NRL
Phép duyệt thứ tự giữa: LNR và RNL
Phép duyệt thứ tự cuối: LRN và RLN
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 8
Các phép duyệt cây
Root
A
N p
B
C
G
H
D
E
p^.left
p^.right
R
L
I
F
Thứ tự đầu
NLR: A B C D E F G H I
NRL: A G I H B D F E C
Thứ tự giữa
LNR: C B E D F A H G I
RNL: I G H A F D E B C
Thứ tự cuối
LRN: C E F D B H I G A
RLN: I H G F E D C B A
Duyệt theo mức A B G C D H I E F
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 9
Định nghĩa cấu trúc cây nhị phân
Ví dụ:
type
ref = ^node;
node = record
info: integer;
left, right: ref
end;
var Root: ref;
Chương 5. Cây
info
left
2006
right
Nguyễn Trung Trực - Khoa CNTT 10
Các phép duyệt cây
Thứ tự duyệt NLR (đệ quy)
procedure Traversing_NLR (p: ref);
begin
if p <> nil then
begin
writeln (p^.info);
{N}
Traversing_NLR (p^.left);
{L}
Traversing_NLR (p^.right); {R}
end
end;
Lệnh gọi: Traversing_NLR (Root);
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 11
Các phép duyệt cây
Thứ tự duyệt LNR (đệ quy)
procedure Traversing_LNR (p: ref);
begin
if p <> nil then
begin
Traversing_LNR (p^.left);
{L}
writeln (p^.info);
{N}
Traversing_LNR (p^.right); {R}
end
end;
Lệnh gọi: Traversing_LNR (Root);
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 12
Các phép duyệt cây
Thứ tự duyệt LRN (đệ quy)
procedure Traversing_LRN (p: ref);
begin
if p <> nil then
begin
Traversing_LRN (p^.left);
{L}
Traversing_LRN (p^.right); {R}
writeln (p^.info);
{N}
end
end;
Lệnh gọi: Traversing_LRN (Root);
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 13
Các phép duyệt cây
Thứ tự duyệt theo mức
f Từ
trái qua phải, từ trên xuống dưới
type qptr = ^queue_item;
queue_item = record
info: ref;
next: qptr
end;
queue_type = record
front, rear: qptr
end;
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 14
Các phép duyệt cây
Thứ tự duyệt theo mức
procedure Queue_Init (var Queue: queue_type);
begin
Queue.front = nil; Queue.rear := nil
end;
function Queue_Empty
(Queue: queue_type): boolean;
begin
Queue_Empty := Queue.front = nil;
end;
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 15
Các phép duyệt cây
Thứ tự duyệt theo mức
procedure Queue_Insert
(var Queue: queue_type; x: ref);
var p: qptr;
begin
new(p); p^.info := x, p^.next := nil;
if Queue.rear = nil then Queue.front := p
else Queue.rear^.next := p;
Queue.rear := p
end;
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 16
Các phép duyệt cây
Thứ tự duyệt theo mức
procedure Queue_Delete
(var Queue: queue_type; var x: ref);
var p: qptr;
begin
p := Queue.front;
Queue.front := p^.next;
x := p^.info;
if Queue.front = nil then Queue.rear := nil;
dispose(p)
end;
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 17
Các phép duyệt cây
Thứ tự duyệt theo mức
procedure Traversing_Level (p: ref);
var Queue: queue_type;
begin
Queue_Init (Queue);
if p <> nil then Queue_Insert (Queue, p);
while not Queue_Empty (Queue) do
begin
Queue_Delete (Queue, p); writeln (p^.info);
if p^.left <> nil then
Queue_Insert (Queue, p^.left);
if p^.right <> nil then
Queue_Insert (Queue, p^.right);
end
end;
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 18
Một số ứng dụng của cây
Tạo cây
procedure Tree_Create (var p: ref);
{Tạo cây gốc p gồm các nút chứa số nguyên
dương - Dùng phép duyệt cây NLR}
var n: integer;
begin
write (‘Nhap nut: ‘); readln(n);
if n <= 0 then p := nil
else begin
new(p); p^.info := n;
Tree_Create (p^.left);
Tree_Create (p^.right)
end
end;
Lệnh gọi: Tree_Create (Root);
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 19
Một số ứng dụng của cây
Với dãy số nhập vào là 1 3 0 0 4 2 0 0 5 0 0
thì quá trình tạo cây theo thủ tục Tree_Create như
sau:
1
1
3
1
3
1
4
3
4
2
Chương 5. Cây
1
2006
3
4
2
5
Nguyễn Trung Trực - Khoa CNTT 20
Một số ứng dụng của cây
Tìm số nút của cây
function Tree_Nodes (p: ref): integer;
{Phép duyệt LRN}
begin
if p = nil then Tree_Nodes := 0
else
Tree_Nodes := Tree_Nodes (p^.left) +
Tree_nodes (p^.right) + 1
end;
Lệnh gọi: n := Tree_Nodes (Root);
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 21
Một số ứng dụng của cây
Tìm chiều cao của cây
function Tree_Height (p: ref): integer;
var lh, rh: integer;
begin
if p = nil then Tree_Height := 0
else
begin
lh := Tree_Height (p^.left);
rh := Tree_Height (p^.right);
if lh < rh then Tree_Height := rh + 1
else Tree_Height := lh + 1
end
end;
Lệnh gọi: h := Tree_Height (Root);
Chương 5. Cây
2006
Nguyễn Trung Trực - Khoa CNTT 22