1. Trang chủ
  2. » Giáo án - Bài giảng

Giai thuat Cau truc cay

18 356 3
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giai Thuat Cau Truc Cay
Trường học Đại học Sư phạm Thành phố Hồ Chí Minh
Chuyên ngành Khoa học máy tính
Thể loại Báo cáo môn học
Năm xuất bản 2023
Thành phố Hồ Chí Minh
Định dạng
Số trang 18
Dung lượng 229,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Nếu ta phân biệt thứ tự các nút con của một cây thì ta gọi cây đó là cây có thứ tự.. Thứ tự của các nút trong một cây có thứ tự được quy ước từ trái sang phải và từ trên xuống dưới.. Thứ

Trang 1

CẤU TRÚC CÂY

I ÐỊNH NGHĨA VÀ CÁC KHÁI NIỆM CƠ BẢN

1 Ðịnh nghĩa :

Cây (Trees) là một tập hợp hữu hạn các phần tử gọi là nút cây (Node), trong đó có một nút đặc biệt gọi là nút gốc (Root) Trên tập hợp các nút này có một quan hệ phân cấp gọi là quan hệ "cha - con"

Một nút có thể có kiểu bất ký, ta thường biểu diễn nút bằng tên nút Tên nút có thể là một ký tự, một số hay một chuỗi và có thể được ghi trong một vòng tròn Ta quy ước biểu diễn cây như sau: Ta viết nút cha ở dòng trên, các nút con ở dòng dưới và quan hệ "cha-con" được biểu diễn bằng một đoạn thẳng nối liền 2 nút

Ví dụ :

Ngoài ra ta có thể định nghĩa cây một cách đệ qui như sau :

Một nút (đơn độc) là một cây và nút đó cũng là nút gốc của cây

Nếu ta có n là một nút và T1, T2, , Tk là các cây với n1, n2, , nk lần lượt là các nút gốc của các cây con thì ta có thể xây dựng một cây mới bằng cách cho n trở thành cha của các nút n1, n2, , nk; Nghĩa là trên cây mới này n là nút gốc còn các cây T1, T2, , Tk là các cây con của nút n

Ðể tiện việc quản lý, người ta cho phép tồn tại một cây không có nút nào, mà ta gọi là cây rỗng (Null tree)

2 Các khái niệm cơ bản :

Một nút đơn độc cũng là một cây

Tập hợp rỗng cũng là một cây mà ta gọi là cây rỗng

Mức của một nút :

+ Nút gốc : Mức 0

+ Các nút cách nút gốc i cạnh được gọi là nút ở mức i

Trang 2

Ví dụ:

Cha - con: Nút A là nút cha của nút B khi nút A ở mức i và nút B ở mức i+1 Ðồng thời có một cạnh nối giữa cặp nút A và B (ta còn gọi B là con của A)

Cha - ông (con - cháu)/ tiền bối - hậu duệ: Nếu có một đường nối từ nút A đến nút B và mức của nút A < mức của nút B thì ta nói A là cha ông (tiền bối) của B và B gọi là con cháu (hậu duệ) của A

Anh em ruột: Các nút con của cùng một nút cha được gọi là các nút anh em ruột

Ðường đi: Cho một dãy các nút n1, n2, , nk sao cho ni là nút cha của ni+1 thì ta nói n1 ( n2 ( ( nk là một đường đi từ nút n1 ( nk Ðộ dài của đường đi bằng số nút trên đường đi trừ 1 hay bằng số cạnh trên đường đi

Nút gốc (Root): Là nút không có nút cha

Nút lá (leaf): Là nút không có nút con

Chiều cao của một nút: Là độ dài đường đi từ nút đó đến nút lá xa nhất

Ðộ sâu của một nút (mức của một nút): Là chiều dài đường đi từ nút gốc đến nút đó

Chiều cao của một cây: Là chiều cao của nút gốc

Bậc của một nút: Là số nút con của nút đó

Bậc của một cây: Là bậc cao nhất của các nút trong cây

+ Cây có bậc n được gọi là cây n - phân

+ Rừng là một tập hợp hữu hạn các cây phân biệt

Nếu ta phân biệt thứ tự các nút con của một cây thì ta gọi cây đó là cây có thứ tự Ngược lại là cây không có thứ tự

Thứ tự của các nút trong một cây có thứ tự được quy ước từ trái sang phải và từ trên xuống dưới

Nếu A và B là 2 nút anh em ruột và A ở bên trái của B thì các nút con cháu của A là nút bên trái tất cả các nút con cháu của B

Ðể xác định nút trái (phải) của một nút n, ta vẽ một đường đi từ nút gốc đến nút n Nút nào nằm bên trái của đường đi thì sẽ là nút trái của nút đó, nút nào nằm bên phải của đường đi thì sẽ là nút phải của nút đó

Ví dụ:

Trang 3

Thứ tự duyệt cây:

Duyệt cây là một quy tắc xử lý lần lượt tất cả các nút của một cây mà ở đó mỗi nút chỉ được xử lý một lần Danh sách liệt kê các nút theo thứ tự xử lý được gọi là danh sách duyệt cây

3 Các phép duyệt cây quan trọng :

Duyệt tiền tự (PreOrder)

Duyệt trung tự (InOrder)

Duyệt hậu tự (PostOder)

Ðịnh nghĩa các phép duyệt cây: Ta có thể định nghĩa phép duyệt cây tổng quát bằng đệ quy như sau :

Cây rỗng : Danh sách duyệt tiền tự, trung tự, hậu tự là danh sách rỗng

Cây có một nút : Danh sách duyệt tiền tự, trung tự, hậu tự chính là nút đó

Ví dụ : Cho một cây như hình sau :

Trang 4

4 Cây có nhản và cây biểu thức :

Ta thường lưu trữ kết hợp một nhản (Label) hoặc một giá trị (value) với một nút của cây Như vậy, nhản của một nút không phải là tên của nút mà là giá trị được lưu tại nút đó Nhản của một nút còn được gọi là khóa của nút

Ví dụ : Cây sau đây sẽ biểu diễn cho biểu thức (a + b) * (a - c)

Trong cây trên thì n1, n2, , n7 là các tên nút còn *, +, -, a, b, c là các nhản của nút

5 Quy tắc biểu diễn một biểu thức toán học trên cây

Mỗi nút lá sẽ biểu diễn cho một toán hạng đơn độc

Mỗi nút trung gian sẽ biểu diễn cho một toán tử Giả sử nút n biểu diễn cho toán tử 2 ngôi, nút con bên trái biểu diễn cho biểu thức E1, nút con bên phải biểu diễn cho biểu thức E2 thì nút n sẽ biểu diễn cho biểu thức Eı E2

Thông thường khi chúng ta duyệt cây thì danh sách duyệt cây là một danh sách các nhản nút Trong trường hợp cây biểu diễn cho biểu thức toán học thì biểu thức duyệt tiền tự cho chúng ta biểu thức tiền tố (Prefix), duyệt trung tự cho chúng ta biểu thức trung tố (Infix) và duyệt hậu tự cho chúng ta biểu thức hậu tố (Postfix) của biểu thức toán học ban đầu

Ví dụ: Ðối với cây biểu thức được cho ở ví dụ trên, ta có:

+ Biểu thức tiền tố : * + a b - a c

+ Biểu thức trung tố : a + b * a - c

+ Biểu thức hậu tố : a b + a c - *

Trang 5

II KIỂU DỮ LIỆU TRỪU TƯỢNG CÂY

1 Các phép toán trên cây

Hàm Parent (n : Node; T : Tree) : Cho kết quả nút cha của nút n trên cây T Nếu n là nút gốc thì hàm cho kết quả là Null

Hàm RightSibling (n : Node; T : Tree) : Cho kết quả là nút anh ruột phải của nút n trên cây T Nếu n không có anh ruột phải thì hàm cho kết quả

là Null

Hàm LeftMostChild (n : Node; T : Tree) : Cho kết quả là nút con trái nhất của nút n trên cây T Nếu n không có con trái nhất thì hàm cho kết quả là Null

Hàm Root (T : Tree) : Cho kết quả là nút gốc của cây T Nếu cây rỗng thì hàm cho kết quả là Null

Thủ tục Createi (V, T1, T2, , Ti) : Là thủ tục tạo cây mới có nhản gốc là V và i cây con T1, T2, , Ti Nếu i = 0 thì cây mới tạo chỉ có một nút đơn độc

Hàm LabelNode(n : Node; T : Tree) : Cho nhản của nút n của cây T

Ví dụ : Dùng các phép toán trên để viết các thủ tục duyệt cây :

Procedure PreOrder (T : Tree);

Var n, c : Node;

Begin

n := Root (T);

Write (LabelNode (n, T);

c := LeftMostChild (n, T);

While c < > Null do

Begin

PreOrder (c, T);

c := RightSibling (c, T );

End;

End;

Procedure InOrder (T : Tree);

Var n, c : Node;

Begin

n := Root (T);

c := LeftMostChild (n, T);

While c < > Null do

Begin

PreOrder (c, T);

Write (LabelNode (n, T);

c := RightSibling (c, T );

End;

End;

Procedure PostOrder (T : Tree);

Trang 6

Var n, c : Node;

Begin

n := Root (T);

c := LeftMostChild (n, T);

While c < > Null do

Begin

PostOrder (c, T);

c := RightSibling (c, T );

Write (LabelNode (n, T);

End;

End;

2 Cài đặt cây

a Cài đặt cây bằng mảng

Cho một cây T có các nút 1, 2, 3, , n Ta có thể dùng mảng A 1 chiều để lưu trữ cây bằng cách cho A[i] = j Với j là nút cha của nút i Nếu i là nút gốc thì ta cho A[i] = Null (Cụ thể là Null = 0)

Ví dụ : Cây : Ðược biểu diễn trong mảng A như sau :

Nếu cây T có nhản ta có thể dùng thêm một mảng L chứa các nhản của cây Bằng cách cho L[i] = x, với x là nhản của nút i, hoặc khai báo mảng A là mảng của các Record gồm có 2 trường : Trường Parent giữ chỉ số của nút cha; trường Labels giữ nhản của nút

Khai báo :

Const Maxlenght = ;

Type ElementType = {Kiểu nhản} ;

Tree = Record

Parent: Array [1 Maxlenght] of Integer;

Labels: Array [1 Maxlenght] of ElementType;

End;

Var T:Tree;

NumNode: Integer; { Số nút tối đa trên cây }

Trang 7

Với cách cài đặt này hàm Parent chỉ tốn một hằng thời gian nhưng các hàm khác thì rất khó cài đặt, để khắc phục tình trạng này người ta quy ước việc đặt tên nút như sau :

+ Ðánh số theo thứ tự tăng dần bắt đầu từ nút gốc

+ Tại mỗi nút thì nút cha được đánh số trước rồi lần lượt đến các nút con từ trái sang phải

b Biểu diễn cây bằng danh sách các con

Một cách biểu diễn khác cũng thường được dùng là biểu diễn cây dưới dạng mỗi nút có một danh sách các nút con Danh sách có thể được cài đặt bằng bất kỳ cách nào mà ta đã biết Tuy nhiên, vì số lượng các nút con của một nút là không biết trước nên cài đặt bằng danh sách liên kết sẽ thích hợp hơn

Ví dụ : Cây ở ví dụ trước có thể được lưu trữ theo dạng :

Nhận xét : Các hàm tìm kiếm thông tin về các con rất thuận lợi, nhưng hàm parent lại bất tiện Ví dụ như cần tìm nút cha của nút 8 thì ta phải duyệt

qua tất cả các danh sách mới tìm ra kết quả

c Biểu diễn cây bằng con trái nhất và anh ruột phải :

Các cấu trúc đã dùng để biểu diễn cây có nhược điểm là khó có thể tạo cây mới từ các cây con bởi vì mỗi cây con được chứa trong một mảng riêng

Vì vậy, nếu muốn thiết lập một cấu trúc dữ liệu trợ giúp tốt cho phép tạo cây thì tất cả các nút của các cây phải được chứa trong cùng một mảng

Ta có thể tổ chức mảng có các phần tử là một Record gồm có 3 trường :

+ Trường Labels : giữ nhản của nút

+ Trường LeftMostChild : Giữ chỉ số của nút con trái nhất

+ Trường RightSibling : giữ chỉ số của nút anh ruột phải

Với cấu trúc này các hàm đều được thực hiện dễ dàng trừ hàm Parent Nếu muốn cải tiến ta có thể tổ chức thêm một trường thứ tư giữ chỉ số của nút cha

Trang 8

Khai báo :

Const MaxNode = ; { Ðộ dài mảng }

Type LabelType = ; { Kiểu nhản }

Var Cellspace : array [ 1 MaxNode ] of Record

Labels : LabelType;

LeftMostChild : Integer;

RightSibling : Integer;

Parent : Integer;

End;

Availble : Integer;

Thủ tục khởi tạo vùng lưu trữ các nút tự do :

Procedure Initialize;

Var i : Integer;

Begin

For i :=1 to MaxNode - 1 do

Cellspace [i].RightSibling := i + 1;

Cellspace [MaxNode].RightSibling := 0;

Available : = 1;

End;

Thủ tục khởi tạo cây rỗng :

Procedure MakeNullTree (Var T : Integer);

Begin

T := Null; {0}

End;

Hàm tìm nút cha của một nút :

Function Parent ( n : Integer; T : Integer) : Integer;

Begin

Parent := Cellspace[n] Parent;

End;

Hàm tìm nút con trái nhất của một nút :

Function LeftMostchild ( n : Integer; T : Integer) : Integer;

Begin

LeftMostChild := Cellspace[n] LeftMostChild;

End;

Hàm tìm nút anh ruột phải của một nút :

Function RightSibling ( n : Integer; T : Integer) : Integer;

Begin

Trang 9

Rightsibling := Cellspace[n] rightsibling;

End;

Thủ tục tạo cây mới từ 2 cây con :

Procedure Create2 (V : LabelType; T 1 , T 2 : Integer) : Integer;

Var Temp : Integer;

Begin

Temp := Available;

Available := Cellspace[Available].Rightsibling;

Cellspace [Temp].LeftMostChild := T1;

Cellspace [Temp].Labels := V;

Cellspace [Temp].Rightsibling := 0;

Cellspace [Temp].Parent := 0;

Cellspace [T1] Rightsibling := T2;

Create2 := Temp; { Nút gốc mới }

End

III CÂY NHỊ PHÂN (BINARY TREE)

1 Ðịnh nghĩa

Cây nhị phân là một cây mà trong đó mỗi nút chỉ có tối đa 2 nút con (2 nhánh)

Trong một cây nhị phân ta cần phân biệt con trái (leftchild) và con phải (rightchild) của một nút

Ta quy ước vẽ nút con trái ở bên trái nút cha và nút con phải ở bên phải nút cha

Ví dụ:

Trang 10

Nếu ta xem (a), (b) là cây và là cây có thứ tự thì 2 cây này chỉ là một

Nếu nói là cây nhị phân thì đây là 2 cây khác nhau

Một số dạng đặc biệt của cây nhị phân :

Cây lệch trái : Các nút trên cây chỉ có con trái không có con phải

Cây lệch phải : Các nút trên cây chỉ có con phải không có con trái

Cây zic-zắc: Là cây mà nếu nút ở mức i chỉ có một con (phải hoặc trái) thì nút ở mức i+1 cũng chỉ có 1 con (phải hoặc trái)

Cây nhị phân đầy đủ: Là cây nhị phân mà các nút đều có đủ 2 con trái và phải (trừ nút lá)

2 Tính chất

3 Cài đặt cây nhị phân

Trang 11

Cách cài đặt này sẽ rất phí miền nhớ khi cây nhị phân là một cây có dạng đặc biệt cây lệch trái, cây lệch phải, cây zic-zắc, và chỉ thích hợp với cây nhị phân đầy đủ

Khai báo :

Const Maxlenght = ;

Type LabelType = ;

LeftChild : Integer;

RightChild : Integer;

Label : LabelType; End;

Tree = array [1 Maxlenght ] of Node ;

b Cài đặt cây nhị phân bằng con trỏ :

Trong cách cài đặt này mỗi nút sẽ là một record gồm có 3 trường :

+ Left : con trỏ giữ địa chỉ của nút con trái

+ Right : con trỏ giữ địa chỉ của nút con phải

+ Info : Lưu trữ nhản (nội dung) của nút

Left Info Right Khai báo :

Type ElementType = ;

Node = Record

Trang 12

Elements : ElementType;

Left : Tree ; Right : Tree ; End;

Thủ tục khởi tạo cây rỗng :

Ðể có thể truy cập đến các nút trên cây, ta cần có một con trỏ T để trỏ đến nút gốc của cây đó Khi cây rỗng thì con trỏ sẽ trỏ đến một giá trị đặt biệt Nil

Procedure MakeNullTree (Var T : Integer);

Begin

T := Nil;

End;

Hàm tạo cây :

Function MakeTree ( x : ElementType ; L, R : Tree) : Tree;

Var T : Tree ;

Begin

New (T) ;

T.^Elements := x;

T Left := L;

T Right := R;

MakeTree := T;

End;

Hàm xác định chiều cao của cây

Function HighTree ( T : Tree ) : Integer ;

Function Max ( a, b : Integer ) : Integer;

Begin

If a < b then

Max := b

Else Max := a ;

End;

Trang 13

Begin { High tree }

If T = Nil then

HighTree := 0

Else

If ( T^.Left = Nil ) and ( T^.Right = Nil ) then

HighTree := 0

Else HighTree := Max (HighTree(T^.Left), HighTree (T^.Right) + 1;

End;

Hàm xác định chiều cao của cây

Function NumNode ( T : Tree ) : Integer ; Begin

If T = Nil then

NumNode := 0

Else NumNode := (NumNode(T^.Left), NumNode (T^.Right) + 1;

End;

Duyệt cây nhị phân

Duyệt tiền tự : (NLR)

Procedure PreOrder ( T : Tree );

Begin

If T < > Nil then

Begin

Write ( T^.Elements );

PreOrder (T^.Left);

PreOrder (T^.Right); End;

End;

Duyệt trung tự : (LNR)

Procedure InOrder ( T : Tree );

Begin

If T < > Nil then

Begin

InOrder (T^.Left);

Write ( T^.Elements ); InOrder (T^.Right);

End;

End;

Duyệt hậu tự : (LNR)

Procedure PostOrder ( T : Tree );

Begin

If T < > Nil then

Trang 14

Begin

PostOrder (T^.Left);

PostOrder (T^.Right);

Write ( T^.Elements );

End;

End;

Hàm tính trị của một biểu thức

- Cây biểu thức là cây nhị phân trong đó các nút trung gian sẽ chứa các toán tử, còn các lá sẽ chứa các toán hạng

- Khi thực hiện tính giá trị của một cây biểu thức, ta sẽ tính theo đúng thứ tự của phép duyệt cây trung tự

Function Value(T : Tree) : Real;

Var x : Real;

Code : integer;

Begin

If (T^.Left = Nil) and (T^.Right = Nil) then

Begin

Val (T^.Elements, x , Code);

Value := x;

End

Else

Begin

If T^.Elements = '+' then Value:= Value (T^.Left) + Value (T^.Right);

If T^.Elements = '-' then Value:= Value (T^.Left) - Value (T^.Right);

If T^.Elements = '*' then Value:= Value (T^.Left) *Value (T^.Right);

If T^.Elements = '/' then

If Value(T^.Right) < > 0 then

Value:= Value (T^.Left) / Value (T^.Right)

Else Write('Loi chia cho 0 ');

End;

End;

IV GIẢI THUẬT MÃ HÓA HUFFMAN

1 Ðặt vấn đề

Giả sử ta có một thông báo là một chuỗi các ký tự, trong đó mỗi ký tự xuất hiện độc lập với cùng một xác suất tại bất kỳ vị trí nào trong thông báo Yêu cầu đặt ra là mã hóa thông báo này thành một chuỗi các ký tự 0, 1

Ta sẽ mã hóa mỗi ký tự trong chuỗi thông báo đã cho, sao cho:

+ Không có ký tự nào được mã hóa thành chuỗi là tiền tố của chuỗi mã hóa ký tự khác (tính chất này được gọi là tính chất tiền tố)

+ Ðộ dài của bộ mã là ngắn nhất

Ngày đăng: 08/09/2013, 16:10

HÌNH ẢNH LIÊN QUAN

Ví dụ: Cho một cây như hình sau: - Giai thuat Cau truc cay
d ụ: Cho một cây như hình sau: (Trang 3)

TỪ KHÓA LIÊN QUAN

w