64
MỤC LỤC LỜI CẢM ƠN.................................................................4 PHẦN MỞ ĐẦU................................................................5 1. Lý do chọn đề tài.......................................................5 2. Mục tiêu đề tài.........................................................5 3. Đối tượng và phạm vi nghiên cứu.........................................6 3.1. Đối tượng nghiên cứu..................................................6 3.2. Phạm vi nghiên cứu....................................................6 4. Cách tiếp cận và phương pháp nghiên cứu.................................6 4.1. Cách tiếp cận.........................................................6 4.2. Phương pháp nghiên cứu................................................6 CHƯƠNG 1: HÀNG ĐỢI.........................................................7 1. TỔNG QUAN VỀ CẤU TRÚC HÀNG ĐỢI..........................................7 1.1. Định nghĩa............................................................7 1.2. Tính chất.............................................................9 1.3. Trừu tượng hóa cấu trúc hàng đợi......................................9 1.4. Các phép toán trên hàng đợi...........................................9 2.5. Cài đặt hàng đợi......................................................9 2.5.1. Cài đặt hàng đợi bằng mảng.........................................10 2.2. Cài đặt hàng đợi bằng danh sách liên kết.............................16 CHƯƠNG 2: CÂY.............................................................20 Trang 1

BaoCao NCKH TreeQueue Ver3

Embed Size (px)

DESCRIPTION

BaoCao NCKH TreeQueue Ver3 DOCX

Citation preview

Page 1: BaoCao NCKH TreeQueue Ver3

MỤC LỤC

LỜI CẢM ƠN..........................................................................................................................................................4

PHẦN MỞ ĐẦU....................................................................................................................................................5

1. Lý do chọn đề tài.............................................................................................................................................5

2. Mục tiêu đề tài.................................................................................................................................................5

3. Đối tượng và phạm vi nghiên cứu..................................................................................................................6

3.1. Đối tượng nghiên cứu.....................................................................................................................................6

3.2. Phạm vi nghiên cứu........................................................................................................................................6

4. Cách tiếp cận và phương pháp nghiên cứu...................................................................................................6

4.1. Cách tiếp cận...................................................................................................................................................6

4.2. Phương pháp nghiên cứu................................................................................................................................6

CHƯƠNG 1: HÀNG ĐỢI.....................................................................................................................................7

1. TỔNG QUAN VỀ CẤU TRÚC HÀNG ĐỢI.................................................................................................7

1.1. Định nghĩa.......................................................................................................................................................7

1.2. Tính chất..........................................................................................................................................................9

1.3. Trừu tượng hóa cấu trúc hàng đợi................................................................................................................9

1.4. Các phép toán trên hàng đợi..........................................................................................................................9

2.5. Cài đặt hàng đợi..............................................................................................................................................9

2.5.1. Cài đặt hàng đợi bằng mảng.....................................................................................................................10

2.2. Cài đặt hàng đợi bằng danh sách liên kết...................................................................................................16

CHƯƠNG 2: CÂY...............................................................................................................................................20

2.1. Tổng quan về cấu trúc cây............................................................................................................................20

2.1.1. Định nghĩa và các khái niệm....................................................................................................................20

Trang 1

Page 2: BaoCao NCKH TreeQueue Ver3

2.2. Cây nhị phân.................................................................................................................................................22

2.2.1. Định nghĩa..................................................................................................................................................22

2.2.2. Tính chất.....................................................................................................................................................23

2.2.3. Các thao tác trên cây nhị phân.................................................................................................................25

2.2.4. Cài đặt cây nhị phân..................................................................................................................................25

2.3. Cây nhị phân tìm kiếm.................................................................................................................................28

2.3.1. Định nghĩa..................................................................................................................................................28

2.3.2. Các thao tác trên CNPTK.........................................................................................................................29

2.3.3. Cài đặt cây nhị phân tìm kiếm..................................................................................................................29

2.3.4. Phân tích đánh giá.....................................................................................................................................32

2.4. Cây nhị phân cân bằng tìm kiếm.................................................................................................................32

2.4.1. Cây nhị phân cần bằng hoàn toàn............................................................................................................32

2.4.1.1. Định nghĩa:..............................................................................................................................................32

2.4.1.2. Đánh giá:..................................................................................................................................................32

2.4.2.Cây nhị phân tự cân bằng (cây AVL)........................................................................................................32

2.4.2.1. Định nghĩa:..............................................................................................................................................32

2.4.2.3. Các thao tác trên cây AVL.....................................................................................................................33

2.4.2.4. Cài đặt cây AVL......................................................................................................................................33

2.4.2.5. Đánh giá...................................................................................................................................................37

CHƯƠNG 3. MÔ PHỎNG TRỰC QUAN CÁC PHÉP TOÁN TRÊN HÀNG ĐỢI VÀ CÂY......................39

3.1. Phân tích và ý tưởng.....................................................................................................................................39

3.1.1. Phân tích.....................................................................................................................................................39

3.1.2.Ý tưởng........................................................................................................................................................40

3.2. Giao diện chính.............................................................................................................................................40

Trang 2

Page 3: BaoCao NCKH TreeQueue Ver3

KẾT LUẬN..........................................................................................................................................................45

1. Ưu điểm..........................................................................................................................................................45

2. Nhược điểm....................................................................................................................................................45

3. Hướng phát triển...........................................................................................................................................45

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN....................................................................................................46

NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN....................................................................................................47

Trang 3

Page 4: BaoCao NCKH TreeQueue Ver3

LỜI CẢM ƠN

Sau thời gian học tập, tìm hiểu và nghiên cứu tại khoa Đào Tạo quốc tế - trường Đai

học Duy Tân, được sự giúp đỡ quý báu của các thầy giáo, cô giáo nhóm chúng em đã hoàn

thành bài nghiên cứu khoa học của mình.

Để hoàn thành bài nghiên cứu một cách hoàn thiện nhất có thể, trước hết cho phép

chúng em được bày tỏ lời cảm ơn chân thành tới cô Nguyễn Thị Bảo Trang đã hướng dẫn

tận tình, giúp đỡ chúng em trong suốt quá trình hoàn thành bài nghiên cứu.

Ngoài ra em xin cảm ơn các thầy, các cô với sự giúp đỡ nhiệt tình trong quá trình

giảng dạy đã trang bị cho chúng em một nền tảng kiến thức vững chắc cũng như các tài liệu

thao khảo về lập trình.

Đây là lần đầu tiên chúng em làm một bài nghiên cứu cũng như kinh nghiệm bản thân

còn hạn chế nên bài nghiên cứu của chúng em không thể tránh khỏi những sai sót. Vì vậy,

chúng em rất mong nhận được sự chỉ bảo, đóng góp ý kiến của các thầy cô để chúng em có

điều kiện bổ sung, nâng cao kiến thức của mình, phục vụ tốt hơn các công tác thực tế sau

này.

Em xin chân thành cảm ơn!

Đà Nẵng ngày ...., tháng ....., năm .....

Trang 4

Page 5: BaoCao NCKH TreeQueue Ver3

PHẦN MỞ ĐẦU

1. Lý do chọn đề tài.

Trong khoa học máy tính, cấu trúc dữ liệu là một cách lưu dữ liệu trong máy tính sao

cho nó có thể được sử dụng một cách hiệu quả. Một cấu trúc dữ liệu được lựa chọn cẩn thận

sẽ cho phép thực hiện thuật toán hiệu quả hơn.

Việc xây dựng chương trình này nhằm hỗ trợ tốt nhất về cấu trúc dữ liệu Hàng đợi

(Queue) và Cây (Tree) góp phần giúp cho quá trình giảng dạy của Giảng viên về môn cấu

trúc dữ liệu & giải thuật được tốt. Nhằm tìm hiểu những thuật toán cơ bản của cấu trúc dữ

liệu và giải thuật, tạo điều kiện cho sinh viên có khả năng tìm tòi, tự học và làm việc độc

lập.

Những hình ảnh cụ thể luôn tạo cho sinh viên có một cái nhìn trực quan hơn về việc

học, với những quá trình mô phỏng bằng hình ảnh của đề tài sẽ hỗ trợ cho người học có thể

tiếp thu kiến thức một cách nhanh nhất và nắm được vấn đề ngay tại lớp (có thể hiểu ro về

cấu trúc dữ liệu của Hàng đợi và Cây được lưu trữ trong máy tính như thế nào và nắm được

tưng bước thực hiện của các giải thuật trên hai cấu trúc dữ liệu này). Đề tài sẽ thúc đẩy chất

lượng của việc học cao hơn, tạo một nền tảng lập trình vững chắc cho sinh viên sau này.

Quá trình giảng dạy của giảng viên luôn là vấn đề quan trọng, nó luôn ảnh hưởng tới

việc học và tiếp thu của sinh viên. Vậy nên chương trình nhằm nâng cao chất lượng giảng

dạy và đào tạo của giảng viên dành cho sinh viên công nghệ thông tin tại trường ĐH Duy

Tân nói riêng và các trường cao đẳng, đại học trên toàn quốc nói chung.

Tạo ra một sản phẩm trí tuệ ảnh hưởng tới việc học cũng như việc giảng dạy nhằm

quảng bá uy tín và thương hiệu của trường Đại học Duy Tân, tạo niềm tin cho những học

sinh và sinh viên đam mê lập trình muốn theo con đường công nghệ, nhằm hướng đến một

trường Đại học có chất lượng giảng dạy cao và nhằm đáp ứng nhu cầu tuyển dụng Công

nghệ thông tin ngày một tăng của các doanh nghiệp.

2. Mục tiêu đề tài.

Đề tài nghiên cứu những khái niệm, tính chất, các phép toán chèn, xóa, tìm kiếm về

cấu trúc dữ liệu Hàng đợi, Cây, Cây nhị phân , Cây nhị phân cân bằng, Cây nhị phân tìm

Trang 5

Page 6: BaoCao NCKH TreeQueue Ver3

kiếm, Cây đỏ đen rồi tư đó mô phỏng các phép toán trên Hàng đợi, Cây, Cây nhị phân, Cây

nhị phân cân bằng, Cây nhị phân tìm kiếm, Cây đỏ đen một cách trực quan nhất.

3. Đối tượng và phạm vi nghiên cứu.

3.1. Đối tượng nghiên cứu.

- Lý thuyết về cấu trúc dữ liệu Hàng đợi và Cây.

- Hoạt động của Hàng đợi, Cây và việc áp dụng các giải thuật của Hàng đợi, Cây

trong một số bài toán cơ bản.

- Ngôn ngữ lập trình Java dùng để phục vụ cho hướng phát triển là mô phỏng trực

quan cấu trúc dữ liệu và các giải thuật trên Hàng đợi và Cây.

3.2. Phạm vi nghiên cứu.

- Nghiên cứu và làm ro những khái niệm, tính chất về cấu trúc dữ liệu Hàng đợi,

Cây, Cây nhị phân, Cây nhị phân cân bằng, Cây nhị phân tìm kiếm, Cây đỏ đen.

- Nghiên cứu các phép toán chèn, xóa, tìm kiếm trên Hàng đợi, Cây, Cây nhị phân,

Cây nhị phân cân bằng, Cây nhị phân tìm kiếm, Cây đỏ đen.

- Thực hiện mô phỏng các phép toán trên Hàng đợi, Cây, Cây nhị phân, Cây nhị

phân cân bằng, Cây nhị phân tìm kiếm, Cây đỏ đen.

4. Cách tiếp cận và phương pháp nghiên cứu.

4.1. Cách tiếp cận.

Tiếp cận tư lý thuyết thực tiễn giải pháp.

4.2. Phương pháp nghiên cứu.

- Tìm hiểu lý thuyết về cây, hàng đợi và đồ họa qua các tài liệu.

- Trong quá trình tìm hiểu thì học hỏi bạn bè, giáo viên về mặt lý thuyết cũng như

các thao tác khi xây dựng đồ án.

- Thực hành và xây dựng tưng bước đến khi hoàn chỉnh.

Trang 6

Page 7: BaoCao NCKH TreeQueue Ver3

wordsstore

ina

queue

head của hàng đợi

tail của hàng đợi

Tư cần chèn vào more

Hình 1.1: Hàng đợi trước khi không thêm gì.

CHƯƠNG 1: HÀNG ĐỢI

1. TỔNG QUAN VỀ CẤU TRÚC HÀNG ĐỢI

1.1. Định nghĩa.

Là một danh sách nhưng các phép toán chỉ được thực hiện ở hai đỉnh của danh sách.

Một đỉnh gọi là đầu hàng, đỉnh còn lại gọi là cuối hàng. Thêm ở cuối danh sách (tail), còn

bớt thì ở phía đầu của danh sách (head).

Xếp hàng mua vé xe lửa là hình ảnh của hàng đợi, người đến trước mua vé trước,

người đến sau mua vé sau.

Ví dụ:

Trang 7

Page 8: BaoCao NCKH TreeQueue Ver3

wodsstore

ina

queuemore

head của hàng đợi

tail của hàng đợi

Hình 1.2: Hàng đợi sau khi thêm tư more.

storeina

queuemore

head của hàng đợi

tail của hàng đợi

Hình 1.3: Hàng đợi sau khi xóa tư words.

Trang 8

Page 9: BaoCao NCKH TreeQueue Ver3

1.2. Tính chất.

Vào trước ra trước (First in First out: FIFO).

1.3. Trừu tượng hóa cấu trúc hàng đợi.

Mô tả dữ liệu.

A = (a0, a1, ... ,an)

Trong đó:

a0: Phần tử ở đầu của hàng đợi A.

an: Phần tử ở cuối hàng đợi của A.

Ví dụ: A = (1, 3, 5, 7, 9)

khi đó:

1: phân tử đầu hàng đợi.

9: phần tử cuối hàng đợi.

1.4. Các phép toán trên hàng đợi.

Peek: Trả về phần tử ở đầu hàng đợi nhưng không xóa nó.

A = (a0, a1, ..., an-1, an) peek() a0.

Ví dụ: A(1,3,5)

peek() 1.

Pop: Trả về phần tử đầu hàng đợi và xóa nó.

A = (a0, a1, ..., an-1, an) A = (a0, a1, ..., an)

Ví dụ: A = (14, 6, 8)

pop() A= (6, 8)

Push (x): Đưa một giá trị vào cuối hàng đợi

A = (a0, a1, ..., an) A = (a0, a1, ..., an, x)

Ví dụ: A = (2, 6, 7)

push(25) A = (2,6,7,25).

2.5. Cài đặt hàng đợi.Có nhiều cách cài đặt hàng đợi:Cài đặt hàng đợi bằng mảng bằng cách sử dụng một cặp chỉ số theo doi các trường

hợp ở đầu và ở đuôi của hàng đợi. Việc cài đặt hàng đợi bằng mảng xoay tròn khi sử dụng các chỉ số đầu và đuôi có thể rất hiệu quả khi kích thước hàng đợi là cố định.

Trang 9

Page 10: BaoCao NCKH TreeQueue Ver3

Hình 2.5.1: Hàng đợi mảng vòng trước khi chèn tư First

Hàng đợiTư cần chèn vào Head của hàng đợi

First

0

0

0

Tail của hàng đợi

Size

1

2

3

0

4

5

6

Cài đặt hàng đợi bằng danh sách liên kết thì rất tốt khi kích thước hàng đợi không cố định.

2.5.1. Cài đặt hàng đợi bằng mảng.

Cài đặt hàng đợi bằng cách sử dụng mảng thì rất hiệu quả khi biết trước số phần tử tối đa của hàng đợi

Việc loại bỏ một phần tử trong hàng đợi được thực hiện ở đầu mảng và việc thêm phần tử mới vào hàng đợi được thực hiện ở cuối mảng, sử dụng cặp chỉ số đầu và đuôi và khởi tạo một mảng vòng.

Ví dụ:

Trang 10

Page 11: BaoCao NCKH TreeQueue Ver3

Hình 2.5.2: Hàng đợi mảng vòng sau khi chèn tư First

First

Hàng đợiTư cần chèn vào Head của hàng đợi

First

1

0

1

Tail của hàng đợi

Size

1

2

3

0

4

5

6

Hình 2.5.3: Hàng đợi mảng vòng sau khi chèn tư Second

First

Head của hàng đợi

0

1

Tail của hàng đợi Second1

2

3

0

4

5

6

2

Size

Trang 11

Hàng đợi

Page 12: BaoCao NCKH TreeQueue Ver3

Head của hàng đợiTrả về tư First

First

1

Size

1

2

3

0

4

5

6

Second

1

Tail của hàng đợi

0

Hình 2.5.4: Hàng đợi mảng vòng sau khi xóa tư First

Ví dụ: Một trường hợp khác của mảng vòng.

Trang 12

Page 13: BaoCao NCKH TreeQueue Ver3

Hình 2.5.5: Hàng đợi mảng vòng trước khi chèn tư Second.

Second

Tư cần chèn vào Hàng đợi

6

Head của hàng đợi

5

Tail của hàng đợi First

1

3

2

0

6

5

1

Size

Tư cần chèn vào

Second

2

Head của hàng đợi

5

0

Tail của hàng đợi

First

4

3

2

1

0

6

5

Second

Size

Hình 2.5.6: Hàng đợi mảng vòng sau khi chèn tư Second.

Trang 13

Hàng đợi

4

Page 14: BaoCao NCKH TreeQueue Ver3

Hình 2.5.7: Hàng đợi mảng vòng sau khi chèn tư Third

Third

Size

Tư cần chèn vào

3

Head của hàng đợi

5

1

Tail của hàng đợi

First

4

3

2

1

0

6

5

Second

Third

Size

2

Head của hàng đợi

6

1

Tail của hàng đợi

Hình 2.5.8: Hàng đợi mảng vòng sau khi xóa tư First

4

3

2

1

0

6

5

Second

ThirdFirst

Trả về tư First sau khi xóa

Trang 14

Hàng đợi

Hàng đợi

Page 15: BaoCao NCKH TreeQueue Ver3

Second

Trả về tư Second sau khi xóa

Third

4

3

2

1

0

6

5

Hàng đợiHead của hàng đợi

0

Tail của hàng đợi

1Size

1

Hình 2.5.9: Hàng đợi mảng vòng sau khi xóa tư Second

Size

0

Third

Trả về tư Third sau khi xóa

4

3

2

1

0

6

5

Hàng đợiHead của hàng đợi

1

Tail của hàng đợi

1

Hình 2.5.10: Hàng đợi mảng vòng sau khi xóa tư Third

Trang 15

Page 16: BaoCao NCKH TreeQueue Ver3

Ở hai ví dụ trên, ta thấy rằng khi head = tail có nghĩa là hàng đợi rỗng. Nhưng khi hàng đợi đầy thì chỉ số head cũng bằng chỉ số tail. Vì vậy ta cần xử lý 2 chỉ số này để tránh sự mơ hồ giữa hàng đợi rỗng và đầy. Để loại bỏ sự mơ hồ chúng ta cần kiểm tra số phần tử (size) của hàng đợi, khi số phần tử bằng kích thước tối đa của hàng đợi thì khi đó hàng đợi đã đầy, còn khi số phần tử hàng đợi bằng 0 thì lúc đó hàng đợi rỗng.

Việc xác định kích thước của hàng đợi là rất quan trọng, và việc thay đổi lại kích thước của hàng đợi thì có thể thực thi được, nhưng đòi hỏi rất tốn chi phí. Chúng ta phải chắc rằng hàng đợi có kích thước quá nhỏ thì mới yêu cầu thay đổi lại kích thước. Nhưng nếu kích thước hàng đợi quá lớn thì sẽ dẫn đến lãng phí bộ nhớ.

Như vậy, để tạo ra hàng đợi, ta cần dùng một mảng gồm các phần tử có kiểu E nào đó.

Thêm phần tử vào cuối hàng đợi (Push).

Nếu hàng đợi đầy thì phát sinh thêm một ngoại lệ. Nếu hàng đợi chưa đầy thì thêm phần tử mới vào cuối hàng đợi tại vị trí tail, cập nhật lại vị trí tail và nếu vị trí tail quay vòng lại đầu mảng thì quay về lại vị trí 0, tăng số phần tử hàng đợi lên 1 và phương thức này nhận giá trị true.

public boolean push(E e){if(size >= a.length){

System.out.println("Queue if full");System.exit(0);

}a[tail++] = e;tail = tail % a.length;size++;return true;

}

Xóa phần tử đầu hàng đợi (Pop).Nếu hàng đợi rỗng thì phát sinh thêm một ngoại lệ. Ngược lại thì xóa phần tử ở đầu

hàng đợi tại vị trí head, cập nhật lại vị trí head và nếu vị trí head quay vòng lại đầu mảng thì quay về lại vị trí 0, giảm phần tử hàng đợi xuống 1 và phương thức này trả về phần tử đã bị xóa.

public E pop(){if(size < 0){

System.out.println("Queue is empty");System.exit(0);

}E temp = a[head++];

Trang 16

Page 17: BaoCao NCKH TreeQueue Ver3

Hình 2.2.1: Hàng đợi trước khi chèn tư more

a

more

words

in

queue

Head của hàng đợi

Tail của hàng đợi

Tư cần chèn vào store

head = head % a.length;size--;return temp;

} Trả về phần tử ở đầu hàng đợi (Peek)Nếu kích thước mảng < 0 thì trả về giá trị null, ngược lại thì trả về phần tử đầu hàng

đợi.public E peek(){

if(size < 0)return null;

return a[head];}

2.2. Cài đặt hàng đợi bằng danh sách liên kết.Cài đặt hàng đợi bằng danh sách liên kết là một phương pháp tốt khi ta không cần cố

định kích thước của hàng đợi.

Ví dụ:

Trang 17

Page 18: BaoCao NCKH TreeQueue Ver3

Hình 2.2.3: Hàng đợi sau khi xóa tư words.

words

Head của hàng đợi

Trả về tư words sau khi xóa

a

in

queueTail của hàng đợi

store

more

more

words

store

a

in

queue

Hình 2.2.2: Hàng đợi sau khi thêm tư more.

more

Head của hàng đợi

Tail của hàng đợi

Trả về tư words sau khi xóa

Trang 18

Page 19: BaoCao NCKH TreeQueue Ver3

Như vậy, để tạo ra hàng đợi chứa một vài tham số kiểu E, ta cần một Node gồm 2 thuộc tính, một thuộc tính tham chiếu đến giá trị kiểu E, thuộc tính còn lại tham chiếu đến một Node khác.

Vì lớp Node này chỉ được biết bởi lớp hàng đợi, nên lớp Node sẽ được cài đặt như là lớp lồng trong lớp hàng đợi.

Vì kích thước của hàng đợi không cần cố định, nên ta chỉ cần dùng một hàm khởi tạo.

Thêm phần tử vào cuối hàng đợi.Cấp phát bộ nhớ cho node p, nếu hàng đợi rỗng thì p vưa là head vưa là tail, ngược lại

thì trỏ link liên kết tail tới node p.public boolean push(E e){

Node<E> temp = new Node<E> (e,null);if(tail==null)

head = temp;else

tail.next=temp;tail=temp;size++;return true;

}

Lấy phần tử ra khỏi hàng đợi.public E remove(){

if(size <= 0){return null;

}else{Node<E> temp = head;if(head == tail){

head=tail=null;}else{

head=head.next;}return temp.info;

}}

Trang 19

Page 20: BaoCao NCKH TreeQueue Ver3

CHƯƠNG 2: CÂY

2.1. Tổng quan về cấu trúc cây.

2.1.1. Định nghĩa và các khái niệm.Cây là một cấu trúc phi tuyến tính. Một cây (tree) là một tập hữu hạn các nút trong đó

có một nút đặc biệt gọi là nút gốc (root), giữa các nút có mối quan hệ phân cấp gọi là quan

hệ "cha-con".

Có thể định nghĩa cây một cách đệ quy như sau:

Một nút là một cây. Nút đó cũng là gốc của cây ấy.

Nếu T1, T2, ..., Tn là các cây, với n1, n2, ... nk lần lượt là các gốc, n là một nút và

n có quan hệ cha - con với n1, n2, ... nk thì lúc đó một cây mới T sẽ được tạo lập,

với n là gốc của nó. n được gọi là cha của n1, n2, ... nk, ngược lại n1, n2, ... nk được

gọi là con của n. Các cây T1, T2, ..., Tn được gọi là các cây con (substrees) của n.

Ta quy ước: Một cây không có nút nào được gọi là cây rỗng (null tree).

Có nhiều đối tượng có cấu trúc cây.

Ví dụ:

Mục lục của một quyển sách, hoặc một chương trong sách có cấu trúc cây.

Cấu trúc thư mục trên đĩa cũng có cấu trúc cây, thư mục gốc có thể coi là gốc

của cây đó với các cây con là các thư mục con và tệp nằm trên thư mục gốc.

Gia phả của một họ tốc cũng có cấu trúc cây.

Một biểu thức số học gồm các phép toán cộng, trư, nhân, chia cũng có thể lưu

trữ trong một cây mà các toán hạng được lưu trữ ở nút lá, các toán tử được lưu trữ

ở các nút nhánh, mỗi nhánh là một biểu thức con.

Ta có một cây tổng quát như sau:

Trang 20

Page 21: BaoCao NCKH TreeQueue Ver3

Hình CTQ

Đối với cây, chẳng hạn xét cây ở Hình CTQ:

Nút A được gọi là gốc của cây.

B, C, D là gốc của các cây con gốc của A.

A là cha của B, C, D còn B, C, D là con của A.

Số các con của một nút gọi là cấp (degree) của nút đó. Ví dụ nút A có 3 con là B, C,

D nên cấp của A là 3, cấp của C là một, D là 2, B là 3.

Nút có cấp bằng 0 gọi là lá (leaf) hay nút tận cùng (terminal node). Ví dụ các

nút E, F, G, H, I, J. Nút không là lá được gọi là nút nhánh (branch node).

Cấp cao nhất của nút trên cây gọi là cấp của cây đó. Như hình trên là cây cấp 3.

Gốc của cây có số mức (level) là 1. Nếu nút cha có số mức là i thì nút con có số mức

là i+1.

Ví dụ nút A có số mức là 1.

Các nút B, C, D cùng có mức là 2.

Các nút E, F, G, H, I, J có mức là 3.

Chiều cao (height) hay chiều xâu (depth) của một cây là số mức lớn nhất của nút có

trên cây đó.

Ở Hình CTQcây có chiều cao là 3.

Nếu n1, n2, ... nk là dãy các nút mà ni là cha của ni+1 với 1≤ i ≤k, thì dãy đó là đường đi

(path) tử n1 đế nk. Độ dài của đường đi (path length) tư nút nk đến nq là số nút phải đi qua để

đi tư nk đến nq ( bằng chiều cao của nq - chiều cao của nk).

Ví dụ nhưHình CTQ độ dài đường đi tư A đến G là 2.

Trang 21

Page 22: BaoCao NCKH TreeQueue Ver3

Nếu thứ tự các cây con của một nút được coi trọng thì cây đang xét là cây thứ tự

(ordered tree), ngược lại là cây không có thứ tự (unordered tree). Thường thứ tự các cây con

của một nút được đặt tư trái sang phải.

2.2. Cây nhị phân.

2.2.1. Định nghĩa.

Cây nhị phân là cây mà mỗi nút có tối đa 2 cây con.

Đối với cây con của một nút người ta phân biệt cây con trái và cây con phải. Như vậy

cây nhị phân là cây có thứ tự.

Cây nhị phân suy biến có một danh sách tuyến tính.

a b c d

Các cây nhị phân a, b, c, d là các cây nhị phân suy biến

Cây a lệch trái, cây b lệch phải, cây c và d là cây zíc zắc.

Cây nhị phân hoàn chỉnh: là cây nhị phân mà các nút ở các mức trư mức cuối đều đạt

tối đa.

Ví dụ: cây sau đây là cây nhị phân hoàn chỉnh.

Trang 22

D

C

B

A

D

C

B

A

D

C

B

A

D

C

B

A

Page 23: BaoCao NCKH TreeQueue Ver3

Cây nhị phân đầy đủ : Là cây nhị phân có các nút tối đa ở mọi mức.

Ví dụ: Cây sau đây là cây nhị phân đầy đủ.

2.2.2. Tính chất.

Trong các cây nhị phân cùng có số lượng nút như nhau 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ặc cây nhị phân gần đầy có

chiều cao nhỏ nhất, loại cây này cũng là cây có dạng "cân đối" nhất.

Số lượng tối đa các nút ở mức i trên 1 cây nhị phân là 2i-1 (i≥1).

Số lượng tối đa các nút trên 1 cây nhị phân có chiều cao h là

2h - 1, tối thiểu là h (h ≥ 1).

Cây nhị phân hoàn chỉnh, không đầy đủ, có n nút thì chiều cao của nó là:

h = [log2(n+1)] + 1

Cây nhị phân đầy đủ, có n nút, thì chiều cao của nó là: h = log2(n+1).

Chứng minh:

1) Lượng tối đa các nút ở mức i trên 1 cây nhị phân là 2i-1 (i≥1).

Chứng minh bằng quy nạp: ta biết:

Ở mức 1: i=1, cây nhị phân có tối đa 1=20 nút.

Ở mức 2: i=2, cây nhị phân có tối đa 2 =21 nút.

Trang 23

A

D

C

GE

B

F

Page 24: BaoCao NCKH TreeQueue Ver3

Giả sử kết quả đúng với mức i - 1, nghĩa là ở mức này cây nhị phân có tối đa là 2 i-2

nút. Mỗi nút ở mức i-1 sẽ có tối đa hai con, do đó 2i-2 nút ở mức i-1 sẽ cho:

2i-2 x 2 = 2i-1 nút tối đa ở mức i.

Tính chất trên được chứng minh (1).

2) Số lượng tối đa các nút trên 1 cây nhị phân có chiều cao h là 2h - 1, tối thiểu là h

(h ≥ 1).

Ta biết rằng chiều cao của cây là số mức lớn nhất có trên cây. Theo chứng minh (1) ta

suy ra số nút tối đa có trên cây nhị phân với chiều cao h là:

20 +21 +22 + ... + 2h-1 = 2h - 1.

Lưu trữ cây nhị phân:

Lưu trữ kế tiếp: Với cây nhị phân đầy đủ, ta đánh số các nút tư 1 trở đi, hết mức này

đến mức khác, tư trái qua phải.

Ví dụ với cây đày đủ ở trên được lưu trữ như sau:

Lưu trữ bằng danh sách liên kết.

Trong cách lưu trữ này , mỗi nút ứng với một phần tử nhớ có quy cách như sau:

LPTR : Con trỏ trỏ tới cây con trái của nút đó

RPTR : Con trỏ trỏ tới cây con phải của nút đó

INFO : Trường thông tin.

Ví dụ cây nhị phân sau đây:

Trang 24

A B C D E F G

v[0] v[1] v[2] v[3] v[4] v[5] v[6]

A

D

C

GE

B

F

LPTR INFO RPTR

Page 25: BaoCao NCKH TreeQueue Ver3

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

Các thao tác trên cây nhị phân bao gồm:

Khởi tạo cây nhị phân.

Tạo mới 1 nút .

Thêm 1 nút vào cây nhị phân.

Duyệt qua các nút trên cây nhị phân.

Tính chiều cao của cây.

Tính số nút của cây.

Hủy 1 nút trên cây nhị phân.

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

Định nghĩa cây nhị phân.

class TNode{int data;TNode left,right;

} Khởi tạo cây nhị phân.

Cho con trỏ quản lí địa chỉ nút gốc về con trỏ NULL.

void btree(Node root){

root = null;}

Tạo mới một nút.

Cấp phát bộ nhớ cho một nút, cất dữ liệu vào nút, gán left, right == null, trả về địa

chỉ nút.

Trang 25

Khi cây rỗng thì T=NULL

A

D

C

E

B

Page 26: BaoCao NCKH TreeQueue Ver3

Node make_Node(int x){

Node p = new Node();p.data = x;p.left = p.right = null;return p;

} Thêm một nút vào cây nhị phân.

Nếu khóa của gốc khác khóa cần chèn ta tìm nó trong cây con trái hoặc phải. Nếu

cây con trái hoặc phải tương ứng là rỗng (không tìm thấy) thì thêm một nút và gán

cho nút ấy khóa cần chèn.

Giải thuật thêm trái nhất.

void set_right(int x){

Node p = new Node();if(p == null)

System.out.println("Nút không tồn tại");else

if(p.right!=null)System.out.println("Nút đã có bên phải");

elsep.right = make_Node(x);

}Giải thuật thêm phải nhất.

void set_left (int x){

Node p = new Node();if(p == null)

System.out.println("Nút không tồn tại");else

if(p.left!=null)System.out.println("Nút đã có bên trái");

elsep.left = make_Node(x);

} Duyệt các nút trên cây nhị phân.

Duyệt theo thứ tự nút gốc trước (Preoder).

Duyệt nút gốc, duyệt cây con bên trái, duyệt cây con bên phải (Node - Left -

Right).

Trang 26

Page 27: BaoCao NCKH TreeQueue Ver3

void preOrder(Node<T> r){

if(r!=null){

System.out.println(r.info+" ");preOrder(r.left);preOrder(r.right);

}}

Duyệt theo thứ tự nút gốc giữa (InOder)

Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con bên phải (Left - Node -

Right).

void inOrder(Node<T> r){

if(r!=null){

inOrder(r.left);System.out.println(r.info+" ");inOrder(r.right);

}}

Duyệt theo thứ tự nút gốc sau (PostOder)

Duyệt cây con bên trái, duyệt cây con bên phải, duyệt nút gốc(Left – Right -

Node).

void postOrder(Node<T> r){if(r!=null){

postOrder(r.left);postOrder(r.right);System.out.println(r.info+" ");

}}

Giải thuật tính chiều cao của cây.

Để tính chiều cao của cây (TH) chúng ta phải tính chiều cao của các cây con, khi

đó chiều cao của cây chính là chiều cao lớn nhất của các cây con cộng thêm 1 (chiều

cao nút gốc). Như vậy thao tác tính chiều cao của cây là thao tác tính đệ quy chiều

cao của các cây con (chiều cao của cây con có gốc là nút lá bằng 1).

int Height(Node<T> r){

Trang 27

Page 28: BaoCao NCKH TreeQueue Ver3

if(r==null) return 0;int HL = Height(r.left);int HR = Height (r.right);if(HL>HR)

return HL+1;return HR+1;

} Giải thuật đếm số nút của cây.

Tính số nút của cây tương tự tính chiều cao của cây, số nút của cây con + 1.

int count(Node<T> r){

if(r==null) return 0;if(r.left==null&&r.right==null)

return 1+count(r.left)+count(r.right);return count(r.left)+count(r.right);

}2.3. Cây nhị phân tìm kiếm.

2.3.1. Định nghĩa.

Cây nhị phân tìm kiếm (CNPTK) là cây nhị phân trong đó tại mỗi nút, khóa của nút

đang xét lớ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ủa

các nút thuộc cây con phải.

Cây nhị phân tìm kiếm là một cấu trúc dữ liệu cơ bản được sử dụng để xây dựng các

cấu trúc dữ liệu trưu tượng hơn như các tập hợp, đa tập hợp, các dãy kết hợp.

Nếu một CNPTK có chứa các giá trị giống nhau thì nó biểu diễn một đa tập hợp.

Nếu một CNPTK không chưa các giá trị giống nhau thì nó biểu diễn một tập hợp đơn

trị.

Trang 28

Page 29: BaoCao NCKH TreeQueue Ver3

Hình CNPTK

2.3.2. Các thao tác trên CNPTK.

Các thao tác trên CNPTK bao gồm:

Giải thuật tìm kiếm.

Giải thuật chèn.

Giải thuật xóa

Giải thuật sắp xếp.

2.3.3. Cài đặt cây nhị phân tìm kiếm.

Định nghĩa cây nhị phân tìm kiếm.

private class Node<E>{private E info;private Node<E> left, right;

}private Node root;

Khởi tạo CNPTK.

public Node(E data, Node<E> left, Node<E> right){this.info=data;this.left=left;this.right=right;

}public Node(E data){

this.info=data;left=right=null;

}public BST(){

root=null;}

Giải thuật chèn.

Dựa vào giá trị khóa của nút cần chèn để xác định vị trí chính xác của nút đó. Giả sử

nút cần chèn có giá trị khóa là V, nút gốc của cây có giá trị khóa là N. Nếu V>N thì ta đi

theo nhánh phải và tiếp tục quá trình so sánh. Nếu V<N thì ta đi theo nhánh trái và tiếp tục

quá trình so sánh. Quá trình này sẽ dưng lại khi xảy ra một trong hai trường hợp sau:

V=N. Trong trường hợp này, dữ liệu cần chèn đã có trong cây. Vì vậy ta không

cần chèn thêm nút mới.

Con trỏ trỏ đến null. Tức là ta đã tìm đến vị trí chính xác cho nút mới.

Trang 29

Page 30: BaoCao NCKH TreeQueue Ver3

public Node add(Comparable<E> x, Node r){

if(r==null){r=new Node(x);return r;

}else if(x.compareTo((E) r.info)<0)

{r.left=add(x,r.left);return r;

}else if(x.compareTo((E) r.info)>0){

r.right=add(x,r.right);return r;

}else return r;}

Giải thuật tìm kiếm.

Đối với một cây nhị phân tìm kiếm để tìm xem một khóa X nào đó có trên cây đó

không ta có thể thực hiện như sau:

So sánh X với khóa ở gốc và 1 trong 4 tình huống sau đây sẽ xuất hiện:

1) Không có gốc (cây rỗng): X không có trên cây, phép tìm kiếm không thỏa.

2) X trùng với khóa ở gốc: phép tìm kiếm không thỏa.

3) X nhỏ hơn khóa ở gốc: tìm kiếm thực hiện tiếp tục bằng cách xem xét cây

con trái của gốc với cách làm tương tự.

4) X lớn hơn khóa ở gốc: tìm kiếm thực hiện tiếp tục bằng cách xem xét cây

con phải của gốc với cách làm tương tự.

Như với cây ở Hình CNPTK, nếu X = 40, ta sẽ thực hiện.

So sánh X với 44: X<44, ta chuyển sang cây con trái.

So sánh X với 18: X>18, ta chuyển sang cây con phải.

So sánh X với 37: X>37, ta chuyển sang cây con phải.

So sánh X với 40: X=40, vậy tìm kiếm được thỏa.

Trang 30

Page 31: BaoCao NCKH TreeQueue Ver3

private Node<E> find(Node<E> r,Comparable<E> target){if(r==null) return null;int result = target.compareTo(r.data);if(result==0) return r;if(result<0) return find(r.left,target);return find(r.right,target);

} Giải thuật xóa.

Giả sử ta muốn xóa một nút có nhãn là x, ta tiến hành tìm kiếm trên cây bắt đầu tư nút

gốc: nếu nhãn x lớn hơn nhãn của nút gốc thì ta tìm sang cây con bên phải, ngược lại thì ta

sẽ tìm cây con bên trái. Nếu không tìm thấy thì giải thuật kết thúc.

Nếu tìm gặp thì có 3 trường hợp sau:

Nếu x là lá thì ta thay giá trị x bằng null.

Nếu x chỉ có một nút con thì ta thay giá trị x bằng nút con của nó.

Nếu x có 2 con thì ta thay giá trị x bằng nút lớn nhất trên cây con bên trái (nút

cực phải của cây trái) hoặc nút bé nhất trên cây con bên phải của giá trị x.

Private Node<E> remove(Node<E> r, Comparable<E> removeValue){if(r==null) return null;else if(removeValue.compareTo((E) r.info)<0){

r.left = remove(r.left, removeValue);return r;

}else if(removeValue.compareTo((E)r.info)>0){

r.right = remove(r.right, removeValue);return r;

}else if(r.left==null){

r=r.right;return r;

}else{Node<E> p = r.left;while(p.right!=null)

p=p.right;r.info = p.info;r.left = remove(r.left,p.info);return r;

}}

Trang 31

Page 32: BaoCao NCKH TreeQueue Ver3

2.3.4. Phân tích đánh giá.

Tất cả các thao tác tìm kiếm, bổ sung, loại bỏ trên CNPTK đều có độ phức tạp trung

bình O(h), với h là chiều cao của cây.

Trong trường hợp tốt nhất, CNPTK có n nút sẽ có độ cao h = log2(n). Chi phí tìm

kiếm khi đó sẽ tương đương tìm kiếm nhị phân trên mảng có thứ tự.

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

mỗi nút đều chỉ có một con trư nút lá). Lúc đó các thao tác trên sẽ có độ phức tạp O(n). Vì

vậy cần 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).

2.4. Cây nhị phân cân bằng tìm kiếm.

2.4.1. Cây nhị phân cần bằng hoàn toàn.

2.4.1.1. Định nghĩa:

Cây cân bằng hoàn toàn là cây nhị phân tìm kiếm mà tại mỗi nút của nó, số nút của

cây con trái chênh lệch không quá một so với số nút của cây con phải.

2.4.1.2. Đánh giá:

Một cây rất khó đạt được trạng thái cân bằng hoàn toàn và cũng rất dễ mất cân bằng

vì khi thêm hay loại bỏ các nút trên cây có thể làm cây mất cân bằng (xác suất rất lớn), chi

phí cân bằng lại cây lớn vì phải thao tác trên toàn bộ cây. Tuy nhiên nếu cây cân đối thì việc

tìm kiếm sẽ nhanh. Đối với cây cân bằng hoàn toàn, trong trường hợp xấu nhất thì ta chỉ phải

tìm qua log2n phần tử (n là số nút trên cây).

Do CCBHT là một cấu trúc kém ổn định nên trong thực tế không thể sử dụng. Nhưng

ưu điểm của nó lại rất quan trọng. Vì vậy, cần đưa ra một CTDl khác có đặc tính giống

CCBHT nhưng ổn định hơn. Như vậy, cần tìm các tổ chức một cây đạt trạng thái cân bằng

yếu hơn và việc cân bằng lại chỉ xảy ra ở phạm vi cục bộ nhưng vẫn phải bảo đảm chi phí

cho thao tác tìm kiếm đạt ở mức O(log2n).

2.4.2.Cây nhị phân tự cân bằng (cây AVL).

Cây AVL được gọi theo tên của hai người đề xuất chúng, G.M. Adelson-

Velsky và E.M. Landis, được công bố trong bài báo của họ vào năm 1962: "An algorithm for

the organization of information." (Một thuật toán về tổ chức thông tin).

2.4.2.1. Định nghĩa:

Trang 32

Page 33: BaoCao NCKH TreeQueue Ver3

Cây nhị phân tìm kiếm cân bằng là cây mà tại mỗi nút của nó độ cao của cây con trái

và của cây con phải chênh lệch không quá một.

Cây cân bằng hoàn toàn là cây AVL, nhưng cây AVL chưa chắc là cây cân bằng hoàn

toàn. Tính cân đối của cây AVL nhẹ hơn so với tính cân đối của cây nhị phân cân bằng hoàn

toàn.

2.4.2.3. Các thao tác trên cây AVL.

Các thao tác trên cây AVL bao gồm:

Giải thuật chèn.

Giải thuật xóa.

Khi chúng ta thực hiện chèn hay xóa thì chiều cao của cây sẽ mất cân bằng nên ta có

các phép quay cây để tạo lại cân bằng cho cây.

Quay đơn phải - phải (right - right)

Quay đơn trái - trái (left - left).

Quay kép trái - phải (left - right).

Quay kép phải - trái (right - left).

2.4.2.4. Cài đặt cây AVL.

Định nghĩa cây AVL.

public class AVLTree{private class AVLNode{

private int data;private AVLNode left, right;

} AVLNode root;}

Khởi tạo cây AVL.

public AVLNode(){ data = 0; left = right = null; }

Trang 33

Page 34: BaoCao NCKH TreeQueue Ver3

public AVLNode(int x){ data = x; left = right = null; }

public AVLTree(){ root = null;

} Giải thuật tính chiều cao của cây.

publicint high(AVLNode T){if (T==null) return 0;return 1 + Math.max(high(T.left),high(T.right));

} Giải thuật tìm kiếm Node nhỏ nhất.

private Node findMin(Node t){if(t == null) return t;while(t.pLeft != null) t = t.pLeft;return t;

} Giải thuật chèn.

Việc đi theo đường tìm kiếm trên cây để thấy được khóa mới chưa có sẵn trên cây và

biết được "chỗ" để bổ sung nó vào, tất nhiên được thực hiện tương tự như việc bổ sung một

node vào trong cây nhị phân.

Khi chúng ta chèn một node trên cây AVL thì tính cân bằng sẽ bị phá vỡ, cần một

hoặc hai phép quay để tái cân bằng AVL, nên ta sẽ có thêm các giải thuật quay cây như sau:

Trường hợp 1(LL): Quay phải tại Node gốc.

Trang 34

Page 35: BaoCao NCKH TreeQueue Ver3

public AVLNode qL(AVLNode T){ AVLNode x = T; AVLNode y = x.left; x.left = y.right; y.right = x;return y;

}Trường hợp 2 (LR): Trước hết thực hiện phép quay trái tại Node gốc của cây con

trái để đưa về TH1 (LL) sau đó thực hiện phép quay phải tại Node gốc cha.

public AVLNode qLR(AVLNode T){ AVLNode x = T; AVLNode y = x.right; AVLNode z = y.left; x.right = z.left; y.left = z.right; z.left = x; z.right = y;return z;

}Trường hợp 3(RR): Thực hiện phép quay trái tại Node gốc.

Trang 35

Page 36: BaoCao NCKH TreeQueue Ver3

public AVLNode qR(AVLNode T){ AVLNode x = T; AVLNode y = x.right; x.right = y.left; y.left = x;return y;

}Trường hợp 4 (RL): Trước hết thực hiện phép quay phải tại Node gốc của cây con

trái để đưa về TH3 (RR) sau đó thực hiện phép quay trái tại Node gốc của cây.

public AVLNode qRL(AVLNode T){ AVLNode x = T; AVLNode y = x.left; AVLNode z = y.right; y.right = z.left; x.left = z.right; z.left = y; z.right = x;return z;

}

Tư các phép quay trên ta có giải thuật chèn như sau:

public AVLNode insert(int x, AVLNode T){if (T==null) T = new AVLNode(x);else{

if(T.data==x) System.out.println("Trung");else{

if (x<T.data) T.left = insert(x,T.left);else T.right = insert(x,T.right);int h1 = high(T.left);int h2 = high(T.right);if (Math.abs(h1-h2)>1)

Trang 36

Page 37: BaoCao NCKH TreeQueue Ver3

if (h1>h2)if (high(T.left.left)>high(T.left.right)) qL(T);else qRL(T);

elseif (high(T.right.left)>high(T.right.right)) qR(T);else qLR(T);

return T;}

}}

Giải thuật xóa.

Loại bỏ giống như giải thuật loại bỏ của cây nhị phân, chỉ khác là sau khi loại bỏ cây

bị mất cân đối và phải tái cân đối bằng phép quay như đã làm khi bổ sung. Việc hủy 1 nút có

thể phải cân bằng dây chuyền các nút tư gốc cho đến phần tử bị hủy trong khi thêm vào chỉ

cần 1 lần cân bằng cục bộ.

private Node remove(int x, Node t){if(t == null) return t;if(x < t.number) t.pLeft = remove(x, t.pLeft);elseif(x > t.number) t.pRight = remove(x, t.pRight);else

if(t.pLeft != null&& t.pRight != null){t.number = findMin(t.pRight).number;t.pRight = remove(t.number, t.pRight);

}else t = (t.pLeft != null) ? t.pLeft : t.pRight;

if(getHeight(t.pLeft) - getHeight(t.pRight) > 1)if(getHeight(t.pLeft.pLeft) >= getHeight(t.pLeft.pRight)) t = qL(t);else t = qRL(t);

elseif(getHeight(t.pRight) - getHeight(t.pLeft) > 1)if(getHeight(t.pRight.pRight) >= getHeight(t.pRight.pLeft)) t = qR(t);else t = qLR(t);return t;

}

2.4.2.5. Đánh giá.

Cây nhị phân tìm kiếm mà luôn có dạng cân đối AVL, thì chi phí tìm kiếm đối với nó

ngay trong trường hợp xấu nhất vẫn là O(log2n).

Trang 37

Page 38: BaoCao NCKH TreeQueue Ver3

Ta đã biết cây tìm kiếm nhị phân thông thường có những thuậ lợi lớn về mặt lưu trữ

và truy xuất dữ liệu trong phép toán tìm kiếm thêm vào hay loại bỏ một phần tử. Do đó, cây

tìm kiếm nhị phân xem ra là một cấu trúc lưu trữ dữ liệu tốt.

Tuy nhiên, trong một số trường hợp cây tìm kiếm nhị phân có một số hạn chế. Nó

hoạt động tốt nếu dữ liệu được chèn vào cây theo thứ tự ngẫu nhiên. Tuy nhiên, nếu dữ liệu

được chèn vào theo thứ tự được sắp xếp sẽ không hiệu quả. Khi các trị số cần chèn đã được

sắp xếp thì cây nhị phân trở nên không cân bằng. Khi cây không cân bằng, nó mất đi khả

năng tìm kiếm nhanh (hoặc chèn hoặc xóa) một phần tử đã cho.

Trang 38

Page 39: BaoCao NCKH TreeQueue Ver3

CHƯƠNG 3. MÔ PHỎNG TRỰC QUAN CÁC PHÉP

TOÁN TRÊN HÀNG ĐỢI VÀ CÂY.

3.1. Phân tích và ý tưởng.

3.1.1. Phân tích.Chương trình mô phỏng tưng bước thực hiện một cách trực quan, sinh động, đồng

thời giúp người sử dụng dễ dàng hiểu được ý nghĩa của thuật toán (xuất hiện bên phải chương trình) và phần thông tin (ở góc phải chương trình), mở rộng tư duy trong việc học và dạy.

Mục tiêu: Mô phỏng các thuật toán cơ bản của hàng đợi và cây bằng đồ họa bao gồm: Array Queue. Linked Queue. Binary Tree. Binary Search Tree. Balance Binary Search Tree.Mục đích của chương trình này nhằm mô phỏng một cách đơn giản các thuật toán cơ

bản nên được viết bằng ngôn ngữ java trên nền eclipse. Qua đó, người dùng có thể tự thiết kế và cài đặt chương trình của mình tư các bước mô phỏng trực quan mà chương trình mẫu đang sử dụng đem lại.

Quá trình nhập dữ liệu được thêm nút “add random” để nhập dữ liệu ngẫu nhiên tư máy tính giúp người sử dụng nhanh chóng nhập dữ liệu hơn so với nhập tư bàn phím.

Thao tác trên hàng đợi và cây rất đơn giản. Người dùng chỉ cần nhấn vào diện tích mô phỏng thì sẽ hiện ra các thao tác có thể sử dụng, nhưng không được chạy cùng lúc các thao tác với nhau nhằm hạn chế lỗi có thể xảy ra và giúp việc quan sát tưng bước mô phỏng không bị gián đoạn.

Riêng đối với cây, chương trình được bổ sung thêm hai chức năng giúp việc mô phỏng được tối ưu hơn:

Chức năng vẽ lại vị trí mặc định tất cả các Node của cây hiện hành đồng thời dịch chuyển cây ở giữa màn hình mô phỏng (không thu nhỏ cây) giúp cho người dùng tiện lợi hơn khi muốn phóng to hay thu nhỏ khung chương trình.

Chức năng bật tắt địa chỉ các Node trên cây giúp người dùng tùy chỉnh việc bật tắt việc hiển thị địa chỉ các Node theo ý muốn (không thay đổi được địa chỉ các Node).

Trang 39

Page 40: BaoCao NCKH TreeQueue Ver3

Khung hiển thị đồ họa

Thanh điều chỉnh tốc độNút Play/PauseNút Reset

Danh sách các dòng lệnh

Thông tin từng dòng lệnh

Các Menu chính

Hình 1: Giao diện Chương Trình

3.1.2.Ý tưởng.

3.2. Giao diện chính.

Gồm 3 phần chính:

jPanel hiển thị quá trình mô phỏng bằng giao diện.

jList hiển thị đoạn code đang được gọi và trỏ vào dòng lệnh đang thực hiện.

jTextArea hiển thị thông tin tại thời điểm câu lệnh thực hiện.

Trang 40

Page 41: BaoCao NCKH TreeQueue Ver3

Hình 2: Giao diện của Queue cài đặt bằng mãng.

Hình 3: Quá trình Push giá trị vào Array Queue

Trang 41

Page 42: BaoCao NCKH TreeQueue Ver3

Hình 4: Giao diện của Queue cài đặt bằng LinkedList.

Hình 5: Giao diện của Cây nhị phân

Trang 42

Page 43: BaoCao NCKH TreeQueue Ver3

Hình 6: Phép tìm kiếm trong Cây nhị phân tìm kiếm

Trang 43

Page 44: BaoCao NCKH TreeQueue Ver3

Hình 7: Quá trình Xoay Cây trong Cây nhị phân tìm kiếm tự cân bằng

Các thao tác khi thực hiện trên cây

Thêm (Add) thêm tư bàn phím (Add number(s)). thêm ngẫu nhiên (Add random).

Tìm kiếm một node (Find value). Duyệt cây (Traveral).

Duyệt trước (PreOder). Duyệt giữa (InOrder). Duyệt sau (PostOder). Duyệt theo mức (LevelOrder).

Xóa Node (Delete). Vẽ lại vị trí của cây (Repaint Location). Hiển thị địa chỉ node và ẩn địa chỉ node (Show address/ Hide address).

Trang 44

Page 45: BaoCao NCKH TreeQueue Ver3

KẾT LUẬN1. Ưu điểm.

Giao diện dễ sử dụng. Người học có thể tiếp thu một cách nhanh chóng các tư

tưởng của giải thuật.

Phần lớn là tiếng Việt.

Phần mềm mô phỏng đã cho người dùng thấy được tổng quan về giải thuật của

cây và hàng đợi.

2. Nhược điểm.

Giao diện đồ họa chưa thực sự hấp dẫn.

Chương trình chỉ thực hiện mô phỏng, chưa có các ứng dụng thực tế.

3. Hướng phát triển.

Cải tiến giao diện phần mềm.

Thêm các chức năng khác hỗ trợ việc dạy như làm bài tập, mini game.

Trang 45

Page 46: BaoCao NCKH TreeQueue Ver3

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN..........................................................................................................................................................................................................................................................................................................

Trang 46

Page 47: BaoCao NCKH TreeQueue Ver3

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

.....................................................................................................................................................

Trang 47