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

Nghiên cứu và làm rõ 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

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 (1.42 MB, 47 trang )

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


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


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


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


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

ueue 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 r 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.
uá 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


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 r 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



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ụ:
head của hàng đợi
words

T cần chèn vào
more

store
in
a

tail của hàng đợi

queue

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

Trang 7


wods

store

head của hàng đợi

in
a
queue
more

tail của hàng đợi
Hình 1.2: Hàng đợi sau khi thêm từ more.

head của hàng đợi
store
in
a
queue

tail của hàng đợi

more

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

Trang 8


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:

Trang 9


Cài đặt hàng đợi bằng mảng bằng cách sử dụng một cặp chỉ số theo d i 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.
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ụ:

T cần chèn vào
First

Head của hàng đợi
0

Hàng đợi
0

Tail của hàng đợi

1

0

2

Size
0


3
4
5
6

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

Trang 10


T cần chèn vào

Head của hàng đợi
0

First

Hàng đợi
0

Tail của hàng đợi

1

1

2

Size


First

3

1

4
5
6

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

Hàng đợi
Head của hàng đợi
0

0

First

Tail của hàng đợi

1

Second

1

2


Size
2

3
4
5
6

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

Trang 11


Head của hàng đợi

Trả về t First

0

First

0

Tail của hàng đợi

Second

1
2


1

3

Size

4

1

5
6

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.
T cần chèn vào

Hàng đợi

Second
0
1
Size
Head của hàng đợi
1

2
3


5
Tail của hàng đợi
6

4
5

First

6

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

Trang 12


T cần chèn vào

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

Second

0

0
1

Size


2

2

3

Head của hàng
đợi

4

5

5

First

6

Second

Hình 2.5.6: Hàng đợi mảng vòng sau khi chèn t
Second.
T cần chèn vào
Third

Hàng đợi

Tail của hàng đợi
1


0

Third

1
Size

2

3
Head của hàng đợi

3
4

5

5

First

6

Second

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

Trang 13



Trả về t First sau khi xóa

Hàng đợi

Tail của hàng đợi
First
1

Third

0
1

Size

2

2
Head của hàng
đợi
6

3
4
5
6

Second


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

Hàng đợi

Trả về t Second sau khi xóa Head của hàng
đợi
0
Second
Tail của hàng đợi
Size

1

0

Third

1
2

1
3
4
5
6
Hình 2.5.9: Hàng đợi mảng vòng sau khi xóa t
Second

Trang 14



Trả về t Third sau khi xóa

Hàng đợi

Head của hàng đợi
1

Third

Tail của hàng đợi
Size

1

0
1
2

0
3
4
5
6
Hình 2.5.10: Hàng đợi mảng vòng sau khi xóa t Third

Ở 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.
Trang 15


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++];
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 16


Head của hàng đợi
words
T cần chèn vào


store

more

in

Tail của hàng đợi

a
queue

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

Head của hàng đợi
store
Trả về t words sau khi xóa
words
Tail của hàng đợi

in
a
queue
more

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

Trang 17


Head của hàng đợi

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

store
in
a

Tail của hàng đợi

queue
more

Hình 2.2.2: Hàng đợi sau khi thêm t more.
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;
}
Trang 18


 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


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


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


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


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


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à 2i-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



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



×