1. Trang chủ
  2. » Công Nghệ Thông Tin

Các phương pháp duyệt cây

27 2,5K 12
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 đề Một Số Phương Pháp Duyệt Cây
Tác giả Đỗ Thị Hoà, Ngô Văn Anh
Người hướng dẫn GV Hướng Dẫn
Trường học Đại Học Công Nghiệp Tp. Hồ Chí Minh
Chuyên ngành Tin Học
Thể loại Đồ Án
Năm xuất bản 2010
Thành phố Thái Bình
Định dạng
Số trang 27
Dung lượng 518,39 KB

Nội dung

Các phương pháp duyệt cây

Trang 1

BỘ CÔNG THƯƠNG TRƯỜNG ĐHCN TP.HỒ CHÍ MINH

KHOA SAU ĐẠI HỌC



ĐỒ ÁN TÌM HIỂU MỘT SỐ PHƯƠNG

PHÁP DUYỆT CÂY

Th¸i B×nh, th¸ng 11 n¨m 2010

MỤC LỤC

Lời mở đầu 3

Phần I Tổng quan 4

I Cấu trúc cây 4

1 Định nghĩa: 4

2 Một số khái niệm 4

Trang 2

2.2 Bậc của một cây: 4

2.3 Nút gốc: 4

2.4 Nút lá: 4

2.5 Nút trung gian: 5

2.6 Nút cha, nút con 5

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

2.8 Chiều cao của cây: 5

2.9 Nút trước và nút sau của một mức: 5

2.10 Chiều dài đường đi 5

2.11 Rừng: 6

3.Biểu diễn cây 6

3.1 Biểu diễn bằng các nút với các con trỏ 6

3.2 Biểu diễn cây nhị phân bằng mảng 6

II Các dạng cây thường gặp 7

1 Cây nhị phân 7

1.1 Định nghĩa 7

1.2 Một số tính chất của cây nhị phân: 7

1.3 Biểu diễn cây nhị phân T 8

1.4 Các thao tác trên cây nhị phân 8

2 Cây nhị phân tìm kiếm 8

2.1 Các thao tác trên cây 9

III Các phương pháp duyệt cây 12

1 Định nghĩa 12

2 Một số phương pháp duyệt cây: 12

2.1 Back tracking: 12

2.2-Breadth first search 14

2.3-Depth first search 16

2.4-Node Left Right 17

2.5-Left Node Right 20

2.6-Left Right Node 22

Phần II Cài đặt 24

I.Giao diện 24

II Hướng dẫn sử dụng 24

1.Mô tả chương trình 24

2 Chi tiết sử dụng: 25

2.1 Tạo các node của đồ thị 25

2.2.Cách tạo và xóa liên hệ giữa các node: 25

2.3 Sử dụng các chức năng tìm kiếm: 26

Phần III Kết Luận 27

Trang 3

Lời mở đầu

Cùng với sự phát triển của khoa học kĩ thuật, công nghệ thông tin nói chung và bộmôn cấu trúc dữ liệu và giải thuật nói riêng ngày càng được ứng dụng rộng trong nhiềulĩnh vực Với một cơ sở dữ liệu khổng lồ, việc đưa ra một phương pháp nhằm giải quyếtvấn đề tìm kiếm dữ liệu có hiệu quả và nhanh nhất luôn được sự quan tâm của các nhàphát triển phần mềm Thông thường dữ liệu được biểu diễn dưới dạng các danh sách liênkết Việc truy xuất dữ liệu chưa đạt hiệu quả cao Sử dụng cấu trúc dữ liệu dạng cây làmột giải pháp nhằm tăng hiệu xuất trong các thao tác xử lý Vấn đề đặt ra: Với việc sửdụng cấu trúc dạng cây, chúng ta cần dùng giải thuật nào với từng dạng dữ liệu để đạthiệu quả cao nhất Để giải quyết vấn đề trên ta cùng tìm hiểu một số phương pháp duyệtcây

Trang 4

Cây không có phần tử nào gọi là cây rỗng.

Ví dụ:

2 Một số khái niệm.

2.1 Bậc của một nút:

Bậc của một nút là số cây con của nút đó

Ví dụ: nút T2 trong cây trên có bậc bằng 2

Trang 5

Nút trung gian hay còn gọi là nút giữa là nút có bậc khác 0 và không phải là nútgốc.

Ví dụ: Cây trên có các nút trung gian : T2 , T3 , T4, T7, T8, T9

2.8 Chiều cao của cây:

Chiều cao của một cây hay còn gọi là chiều sâu của cây là mức cao nhất của cácnút lá trong cây

Ví dụ: Cây trên nút chiều cao là 4, bằng mức lớn nhất của các nút lá

2.9 Nút trước và nút sau của một mức:

Nút T được gọi là nút trước của nút S nếu cây con có gốc là T chứa cây con có gốc

là S Khi đó nút S được gọi là nút sau của nút T

Ví dụ: nút T3 là nút trước của các nút T11, T12, T13, T14. Ngược lại các nút T11, T12,

T13, T14 là nút sau của nút T3

2.10 Chiều dài đường đi.

Chiều dài đường đi của một nút là số nhánh cần đi qua tính từ nút gốc để đi đếnnút đó Chiều dài đường đi của nút gốc luôn bằng 1, chiều dài đường đi tới một nút bằngchiều dài đường đi tới nút cha cộng thêm 1

Ví dụ: Chiều dài đường đi tới nút T3 là 2

Chiều dài đường đi của một cây là tổng tất cả các chiều dài đường đi của tất cả cácnút trên cây

Trang 6

Ví dụ: Chiều dài các nút trong cây trên:

3.Biểu diễn cây.

Có nhiều phương pháp biểu diễn cây Cách thường dùng nhất là biểu diễn mỗi nútnhư một dữ liệu kiểu bản ghi, mỗi nút chứa các con trỏ tới các con hoặc cha của nó, hoặc

cả hai Cây cũng có thể biểu diễn bằng các mảng cùng với quan hệ giữa các vị trí trongmảng

3.1 Biểu diễn bằng các nút với các con trỏ

Mỗi nút là một dữ liệu kiểu bản ghi với ban trường: Một trường thường gọi làINFOR chứa thông tin lưu trữ tại nút đó Thông tin này có thể chỉ là một số, một ký tự,cũng có thể là một tập hợp dữ liệu rất phức tạp Hai trường Llink và Rlink chứa các liênkết trái và phải Nếu cây là cây nhị phân Llink trỏ tới con trái của nút, Rlink trỏ tới conphải của nút Nếu cây là cây tổng quá, Llink trỏ tới con cực trái và Rlink trỏ tới em kếcận phải của nút đó Do đó danh sách các nút biểu diễn một cây tổng quát, khi được xem

là biểu diễn của cây nhị phân sẽ cho một cây nhị phân Cây nhị phân này được gọi là câynhị phân tương đương với cây tổng quát ban đầu

3.2 Biểu diễn cây nhị phân bằng mảng

Cây nhị phân đầy đủ là cây nhị phân, trong đó mỗi nút trong chỉ có hai con Câynhị phân hoàn chỉnh là cây nhị phân đầy đủ trong đó tất cả các lá đề ở mức cao nhất Mộtcây nhị phân hoàn chỉnh chiều cao h chỉ có 2h +1 – 1 nút

Người ta có thể dùng một mảng gồm 2h +1 -1 phần tử để biểu diễn cây hoànchỉnh, bằng cách lần lượt lưu trữ thông tin của mỗi nút vào mảng theo thứ tự từ trênxuống dưới, từ trái sang phải Khi đó

Con trái của nút thứ i là phần tử thứ 2*i

Trang 7

Con phải là phần tử thứ 2*i +1Cha của phần tử thứ i là phần tử thứ int(i/2).

Nếu cây là không hoàn chỉnh, ta gán giá trị Null cho các vị trí còn thiếu so với câynhị phân hoàn chỉnh

Một cách khác, dùng mảng hai chiều trong dòng thứ nhất ghi các thông tin củanút, dòng thứ hai ghi chỉ số của nút cha của nút đó với dấu (+)nếu nút hiện tại là con trai,với dấu (–) nếu nút hiện tại là con phải cua nút cha

II Các dạng cây thường gặp

- Số nút ở mức lá ≤ 2h-1, với h là chiều cao của cây

- Chiều cao của cây h ≥ log2N (N - số nút trên trong cây)

1.3 Biểu diễn cây nhị phân T

Cây nhị phân là một cấu trúc bao gồm các phần tử (nút) được kết nối với nhau theo quan

hệ “cha-con” với mỗi cha có tối đa 2 con Để biểu diễn cây nhị phân ta chọn phươngpháp cấp phát liên kết Ứng với một nút, ta dùng một biến động lưu trữ các thông tin:

Trang 8

+ Thông tin lưu trữ tại nút

+ Địa chỉ nút gốc của cây con trái trong bộ nhớ

+ Địa chỉ nút gốc của cây con phải trong bộ nhớ

Khai báo như sau:

typedef struct tagTNODE

{

Data Key;//Data là kiểu dữ liệu ứng với thông tin lưu tại nút

struct tagNODE *pLeft, *pRight; 5

}TNODE;

typedef TNODE *TREE;

1.4 Các thao tác trên cây nhị phân

Thăm các nút trên cây theo thứ tự trước (Node-Left-Right)

Thăm các nút trên cây theo thứ tự giữa (Left- Node-Right)

Thăm các nút trên cây theo thứ tự sau (Left-Right-Node)

2 Cây nhị phân tìm kiếm

Cây nhị phân tìm kiếm là cây nhị phân trong đó tại mỗi nút, khóa của nút đang xétlớn hơn khóa của tất cả các nút thuộc cây con trái và nhỏ hơn khóa của tất cả các nútthuộc cây con phải

Ví dụ:

Nhờ ràng buộc về khóa trên CNPTK, việc tìm kiếm trở nên có định hướng Hơnnữa, do cấu trúc cây việc tìm kiếm trở nên nhanh đáng kể Chi phí tìm kiếm trung bìnhchỉ khoảng log2N

Trong thực tế, khi xét đến CNP chủ yếu người ta xét CNPTK

2.1 Các thao tác trên cây

2.1.1 Thăm các nút trên cây

2.1.2 Tìm một phần tử X trong cây

Trang 9

Dễ dàng thấy rằng số lần so sánh tối đa phải thực hiện để tìm phần tử X là bằng h,với h là chiều cao của cây

Ví dụ: tìm phần tử 55

So sánh X=55 với gốc là 44 vì 55>44 nên sẽ tìm kiếm nhánh bên phải của cây

Tiếp theo lại so sánh X với gốc của cây con nhỏ 88 vì 55 <88 nên tìm ở nhánh trái củacây có gốc 88

Tiếp tục so sánh với cây con gốc 59: 55<59 tìm nhánh bên trái -> kết quả

2.1.3 Thêm một phần tử X vào cây

Việc thêm một phần tử X vào cây phải bảo đảm điều kiện ràng buộc của CNPTK Ta cóthể thêm vào nhiều vị trí khác nhanh trên cây, nhưng nếu thêm vào một nút là thì sẽ dễnhất do ta có thể thực hiện quá trình tương tực thao tác tìm kiếm Khi chấm dứt quá trìnhtìm kiếm ta sẽ tìm đượ vị trí cần thêm

Hàm insert trả về giá trị –1, 0, 1 khi không đủ bộ nhớ, gặp nút cũ hay thành công:

int insertNode(TREE &T, Data X)

T->pLeft =T->pRight = NULL;

return 1; //thêm vào thành công

}

2.1.4 Hủy một phần tử có khóa x

Trang 10

Việc hủy một phần tử X ra khỏi cây phải bảo đảm điều kiện ràng buộc của CNPTK

Có 3 trường hợp khi hủy nút X có thể xảy ra:

X - nút lá X - chỉ có 1 cây con (trái hoặc phải) X có đủ cả 2 cây con

Trường hợp thứ nhất: chỉ đơn giản hủy X vì nó không móc nối đến phần tử nào khác

Trường hợp hai: Trước khi hủy X ta móc nối cha của X với con duy nhất của nó

Trường hợp cuối cùng: ta không thể hủy trực tiếp do X có đủ 2 con => ta sẽ hủy giántiếp Thay vì hủy X, ta sẽ tìm một phần tử thế mạng Y, Phần tử này có tối đa một con.Thông tin lưu tại Y sẽ được chuyển lên lưu tại X Sau đó, nút bị hủy thật sự sẽ là Y giốngnhư 2 trường hợp đầu

Vấn đề là phải chọn Y sao cho khi lưu Y vào vị trí của X, cây vẫn là CNPTK

Sẽ có 2 phần tử thỏa mãn yêu cầu:

Phần tử nhỏ nhất (trái nhất ) trên cây con phải

Phần tử lớn nhất(Phải nhất)trên cây con trái/

Việc chọn lựa phần tử nào là phần tử thế mạng hoàn toàn phụ thuộc vào ý thích củangười lập trình Ở đây, chúng ta sẽ chọn phần tử(phải nhất) trên cây con trái làm phần tửthế mạng

Trang 11

Tuy nhiên, trong trường hợp xấu nhất, cây có thể bị suy biến thành 1 DSLK, lúc

đó các thao tác trên sẽ có độ phức tạp O(n) Vì vậy có cải tiến cấu trúc của CNPTK để đạtđược chi phí cho câc thao tác là log2(n)

Trang 12

III Các phương pháp duyệt cây

1 Định nghĩa

Duyệt một cây là một trình tự làm việc với các nút trong cây, trình tự này giốngnhư một chuyến đi qua các nút trên cây theo các liên kết cha-con Các giải thuật duyệtkhác nhau về thứ tự “viếng thăm” giữa một nút cha và các nút con

2 Một số phương pháp duyệt cây:

Back tracking

Breadth first search

Depth first search.

Node Left Right

Left Node Right

Left Right Node

2.1 Back tracking:

-Giải thuật Back tracking phải có khả năng tìm kiếm ra tất cả các đường có thể có

để tìm được nghiệm : PATH từ node khởi đầu đến goal.

-Back tracking: thực hiện bằng cách “lần” theo các nhánh của đồ thị Từ một trạng

thái, sinh ra các node con, chọn một node con, xem đó là node xét kế tiếp Lặp lại chođến khi tìm thấy một node đích

-Nó thực hiện bằng cách“Lần” theo các node  Đi vào ngõ cụt? Khi gặp nhánhkhông đi tiếp được, giải thuật phải có khả năng quay lui lại node trước đó để đi sangnhánh khác

IF CS = Goal THEN return(SL);

IF CS has no children (Except node in DE, SL and NSL) THEN

WHILE (SL<>[ ] AND CS=First element of SL) DO

BEGIN

Trang 13

add CS to DE

remove first element from SL;

remove first element from NSL;

NSL (New State List): chứa danh sách các node đang đợi xét

DE (Dead End): chứa các node mà con cháu của chúng không chứa đích

CS (Current State): chứa node đang xét

Hướng phát triển của quá trình tìm kiếm tùy theo cơ cấu tổ chức của NSL: FIFO,FILO hay Evaluated

Ví dụ: tìm nốt 71 của cây sau:

Trang 14

Duyệt đi xuống từng cấp, đến nút lá thì đi lên từng cấp:

2.2-Breadth first search

Là graph search với các nút “anh em” của nút hiện thời được xem xét trước các nút “concháu”

remove X which is the leftmost of Open;

IF (X=goal) THEN return (Success) ELSE BEGIN

generate children of X; Put X to close;

remove children of X which is in Open or Close;

Put remain children on RIGHT end of open;

Trang 15

[44 ][18 88 ][88 13 37 ][13 37 59 108 ][37 59 108 15 ][59 108 15 23 40 ][108 15 23 40 55 71 ][15 23 40 55 71 ]

[ ][44]

[44 18]

[44 18 88 ][44 18 88 13 ][44 18 88 13 37 ][44 18 88 13 37 59 ][44 18 88 13 37 59 ]

Trang 16

2.3-Depth first search

Là graph search với các nút “con cháu” của nút hiện thời được xem xét trước cácnút “anh em”

remove X which is the leftmost of Open;

If (X=goal) the return (Success) else begin

generate children of X; Put X to close;

remove children of X which is in Open or Close;

Put remain children on LEFT end of open;

Trang 17

[44]

[18 88 ][13 37 88 ][15 37 88 ][37 88 ][23 40 88 ][40 88 ][88 ][59 108 ][55 71 108]

[71 108]

[108]

[ ][44]

[44 18]

[44 18 13]

[44 18 13 15 ][44 18 13 15 37 ][44 18 13 15 37 23 ][44 18 13 15 37 23 ][44 18 13 15 37 23 88 ][44 18 13 15 37 23 88 59]

[44 18 13 15 37 23 88 59 55]

[44 18 13 15 37 23 88 59 55 71]

2.4-Node Left Right

Cách duyệt: Trước tiên thăm nốt gốc sau đó thăm các nốt của cây con trái rồi đếncây con phải

Giải thuật:

Khai báo cây nhị phân:

template <class Entry>

class Binary_tree {

public:

Binary_tree( );

bool empty( ) const;

void preorder(void (*visit)(Entry &));

void inorder(void (*visit)(Entry &));

void postorder(void (*visit)(Entry &));

int size( ) const;

void clear( );

Trang 18

int height( ) const;

void insert(const Entry &);

Binary_tree (const Binary_tree<Entry> &original);

Binary_tree & operator = (const Binary_tree<Entry> &original); ~Binary_tree( );

Input: subroot là con trỏ node gốc và hàm visit

Output: kết quả phép duyệt

1 if (cây con không rỗng)

1.1 Duyệt node subroot bằng hàm visit

1.2 Call recursive_NLR với nhánh trái của subroot

1.3 Call recursive_NLR với nhánh phải của subroot

End recursive_NLR

Mã C++

template <class Entry>

void Binary_tree<Entry> ::recursive_NLR

(Binary_node<Entry> *sub_root, void (*visit)(Entry &)) {

Trang 19

[44 18]

[44 18 13 ][44 18 13 15 ][44 18 13 15 37 ][44 18 13 15 37 23 ][44 18 13 15 37 23 40 ][44 18 13 15 37 23 40 88][44 18 13 15 37 23 40 88 59][44 18 13 15 37 23 40 88 59 71]

Trang 20

2.5-Left Node Right

Cách duyệt: Trước tiên thăm các nốt của cây con trái sau đó thăm nốt gốc rồi đếncây con phải

Giải thuật:

Algorithm recursive_LNR

Input: subroot là con trỏ node gốc và hàm visit

Output: kết quả phép duyệt

1 if (cây con không rỗng)

1.1 Call recursive_LNR với nhánh trái của subroot

1.2 Duyệt node subroot bằng hàm visit

1.3 Call recursive_LNR với nhánh phải của subroot

End recursive_LNR

Mã C++

template <class Entry>

void Binary_tree<Entry> ::recursive_LNR

(Binary_node<Entry> *sub_root, void (*visit)(Entry &)) {

Trang 21

[13 15]

[13 15]

[13 15 18 ][13 1518 23 ][13 15 18 23 ][13 15 18 23 37 40 ][13 15 18 23 37 40 44 ][13 15 18 23 37 40 44 ][13 15 18 23 37 40 44 ][13 15 18 23 37 40 44 55 ][13 15 18 23 37 40 44 55 59][13 15 18 23 37 40 44 55 59 71 ][13 15 18 23 37 40 44 55 59 71 88 ]

Trang 22

2.6-Left Right Node

Cách duyệt: trước tiênn thăm các nốt của cây con trái sau đó thăm đến cây conphải rồi cuối cùng mới thăm nốt gốc

Giải thuật:

Algorithm recursive_LRN

Input: subroot là con trỏ node gốc và hàm visit

Output: kết quả phép duyệt

1 if (cây con không rỗng)

1.1 Call recursive_LRN với nhánh trái của subroot

1.2 Call recursive_LRN với nhánh phải của subroot

1.3 Duyệt node subroot bằng hàm visit

End recursive_LRN

Mã C++

template <class Entry>

void Binary_tree<Entry> ::recursive_LRN

(Binary_node<Entry> *sub_root, void (*visit)(Entry &)) {

Trang 23

[15 13 23 40 37 18]

[15 13 23 40 37 18 55]

[15 13 23 40 37 18 55 71][15 13 23 40 37 18 55 59][15 13 23 40 37 18 55 59 108]

Trang 24

Phần II Cài đặt I.Giao diện

Chương trình được xây dựng bằng bộ công cụ Visual Studio 2008, ngôn ngữ C#.Với cấu trúc dữ liệu được mô tả như phần trên, giao diện chính của chương trình khi khởiđộng như sau:

Giao diện chương trình

II Hướng dẫn sử dụng

1.Mô tả chương trình

Chương trình giải bài toán tìm kiếm trên đồ thị bao gồm các chức năng:

- Tạo mới: cho phép tạo mới một đồ thị để xử lý

- Mở file: Mở đồ thị từ tệp tin txt đã lưu.

- Lưu file: Cho phép lưu đồ thị đang xử lý thành dạng file txt

- Vẽ cạnh: Bật/ tắt chế độ cho phép thêm và xóa 1 cạnh vào đồ thị.

Ngày đăng: 18/08/2012, 11:53

HÌNH ẢNH LIÊN QUAN

Bảng lịch duyệt: - Các phương pháp duyệt cây
Bảng l ịch duyệt: (Trang 14)
Bảng lịch duyệt: - Các phương pháp duyệt cây
Bảng l ịch duyệt: (Trang 17)
Bảng lịch duyệt: - Các phương pháp duyệt cây
Bảng l ịch duyệt: (Trang 19)
Bảng lịch duyệt: - Các phương pháp duyệt cây
Bảng l ịch duyệt: (Trang 21)
Bảng lịch duyệt: - Các phương pháp duyệt cây
Bảng l ịch duyệt: (Trang 23)

TỪ KHÓA LIÊN QUAN

w