Tải bản đầy đủ (.pdf) (22 trang)

cấu trúc dữ liệu chương 5

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (282.62 KB, 22 trang )

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



×