Khóa luận: Tìm hiểu Cấu trúc dữ liệu Cây Đỏ Đen và Chương trình Mô phỏng

Khóa luận về cấu trúc dữ liệu cây đỏ đen: các khái niệm, thuật toán chèn, xóa và chương trình mô phỏng trực quan bằng ngôn ngữ lập trình Java.

Chuyên ngành

Tin học

Người đăng

Ẩn danh

Thể loại

Khóa luận tốt nghiệp

2012

69
0
0

Phí lưu trữ

30 Point

Tóm tắt

I. Cây Đỏ Đen là gì Khám phá cấu trúc dữ liệu tự cân bằng

Trong khoa học máy tính, Cây Đỏ Đen (Red-Black Tree) là một loại cây nhị phân tìm kiếm có khả năng tự cân bằng. Đây là một cấu trúc dữ liệu và giải thuật nền tảng, được giới thiệu lần đầu bởi Rudolf Bayer vào năm 1972 và sau đó được Guibas và Sedgewick hoàn thiện. Mục tiêu chính của nó là đảm bảo không có nhánh nào của cây dài hơn đáng kể so với các nhánh khác. Nhờ vậy, cây luôn duy trì trạng thái gần như cân bằng hoàn hảo. Điều này giúp các thao tác cơ bản như tìm kiếm, chèn và xóa luôn đạt được độ phức tạp thời gian trong trường hợp xấu nhất là O(log n), với n là số lượng node trong cây. Sự hiệu quả này làm cho Cây Đỏ Đen trở thành lựa chọn ưu việt trong nhiều ứng dụng thực tế, chẳng hạn như trong việc triển khai TreeMap của Java hay quản lý bộ nhớ trong các hệ điều hành. Cấu trúc này hoạt động dựa trên một tập hợp các quy tắc nghiêm ngặt liên quan đến màu sắc của các node (đỏ hoặc đen) và cách chúng được sắp xếp, nhằm duy trì sự cân bằng sau mỗi lần cập nhật dữ liệu.

1.1. Nền tảng từ cây nhị phân tìm kiếm Binary Search Tree

Để hiểu về Cây Đỏ Đen, cần nắm vững khái niệm cây nhị phân tìm kiếm (BST). BST là một cấu trúc dữ liệu dạng cây mà mỗi node chứa một khóa. Đặc tính quan trọng của nó là: với bất kỳ node nào, tất cả các khóa trong cây con bên trái đều nhỏ hơn khóa của node đó, và tất cả các khóa trong cây con bên phải đều lớn hơn. Tính chất này cho phép thực hiện các thao tác tìm kiếm, chèn, xóa rất hiệu quả. Tuy nhiên, hiệu suất của BST phụ thuộc rất nhiều vào hình dạng của cây, vốn được quyết định bởi thứ tự chèn các phần tử. Trong trường hợp dữ liệu được chèn theo thứ tự đã sắp xếp, cây sẽ bị suy biến thành một danh sách liên kết, làm giảm hiệu suất tìm kiếm xuống O(n). Đây chính là tiền đề cho sự ra đời của các loại cây tự cân bằng.

1.2. Giới thiệu về khái niệm cây tự cân bằng Self Balancing Tree

Một cây tự cân bằng là một biến thể của cây nhị phân tìm kiếm, có khả năng tự động điều chỉnh cấu trúc để duy trì chiều cao ở mức tối thiểu sau mỗi thao tác chèn hoặc xóa. Mục tiêu là giữ cho chiều cao của cây luôn ở mức O(log n). Để đạt được điều này, các thuật toán cân bằng cây như phép xoay và đổi màu được sử dụng để tái cấu trúc lại cây khi cần thiết. Ngoài Cây Đỏ Đen, một số cấu trúc phổ biến khác bao gồm cây AVLB-Tree. Mỗi loại có những ưu và nhược điểm riêng về độ phức tạp của các thao tác cân bằng. Cây AVL có các quy tắc cân bằng chặt chẽ hơn, dẫn đến cây cân bằng tốt hơn nhưng thao tác chèn xóa phức tạp hơn. Trong khi đó, Cây Đỏ Đen cho phép sự mất cân bằng ở mức độ nhất định, giúp giảm số lần tái cấu trúc, làm cho nó hiệu quả hơn trong các ứng dụng có tần suất chèn và xóa cao.

II. Thách thức lớn nhất Hạn chế của cây nhị phân tìm kiếm

Mặc dù cây nhị phân tìm kiếm (BST) rất hiệu quả về mặt lý thuyết, nhưng hiệu suất thực tế của nó lại cực kỳ nhạy cảm với thứ tự dữ liệu đầu vào. Vấn đề cốt lõi nằm ở chỗ cây có thể trở nên mất cân bằng nghiêm trọng. Khi các phần tử được chèn vào theo một thứ tự đã được sắp xếp (tăng dần hoặc giảm dần), cây sẽ bị suy biến. Thay vì phân nhánh ra hai bên để giảm chiều cao, cây sẽ phát triển thành một chuỗi dài, giống như một danh sách liên kết. Trong kịch bản này, chiều cao của cây không còn là O(log n) mà trở thành O(n). Hệ quả là độ phức tạp thời gian của các thao tác tìm kiếm, chèn và xóa cũng tăng lên O(n). Điều này vô hiệu hóa hoàn toàn lợi thế của cấu trúc cây. Khả năng dự đoán hiệu suất kém trong trường hợp xấu nhất là một rủi ro lớn trong các hệ thống đòi hỏi sự ổn định và tốc độ. Đây chính là động lực để phát triển các cấu trúc dữ liệu và giải thuật tiên tiến hơn như Cây Đỏ Đen.

2.1. Phân tích trường hợp xấu nhất Cây bị suy biến

Trường hợp xấu nhất của một cây nhị phân tìm kiếm xảy ra khi nó mất đi tính "nhị phân" và trở thành một cấu trúc tuyến tính. Ví dụ, khi chèn một dãy số đã được sắp xếp như 10, 20, 30, 40, 50, mỗi node mới sẽ luôn được thêm vào làm con phải của node trước đó. Cây kết quả sẽ chỉ có các nhánh phải, không có nhánh trái. Trong tình huống này, việc tìm kiếm một phần tử trong cây không khác gì tìm kiếm tuần tự trong một danh sách. Thời gian tìm kiếm cực đại sẽ tỷ lệ thuận với số lượng node. Như tài liệu gốc đã chỉ ra, "nếu là cây nhị phân suy biến... không khác gì một danh sách tuyến tính mà tìm kiếm trên cây đó chính là tìm kiếm tuần tự với chi phí có cấp O(n)". Đây là một hạn chế nghiêm trọng cần được khắc phục.

2.2. So sánh hiệu năng giữa cây cân bằng và cây không cân bằng

Sự khác biệt về hiệu năng giữa một cây cân bằng và một cây không cân bằng là rất lớn. Với một cây cân bằng có n node, chiều cao là khoảng log n. Do đó, mọi thao tác tìm kiếm, chèn, xóa đều chỉ mất thời gian O(log n). Ví dụ, với 1 triệu phần tử, thao tác chỉ cần khoảng 20 lần so sánh. Ngược lại, với một cây không cân bằng có n node, chiều cao có thể lên tới n. Lúc này, thao tác tìm kiếm trong trường hợp xấu nhất có thể cần tới n lần so sánh, tức là 1 triệu lần. Sự khác biệt này cho thấy tầm quan trọng của các thuật toán cân bằng cây, giúp đảm bảo hiệu suất ổn định và có thể dự đoán được, bất kể thứ tự dữ liệu đầu vào.

III. Bí quyết cân bằng 5 thuộc tính cốt lõi của Cây Đỏ Đen

Sức mạnh của Cây Đỏ Đen nằm ở việc tuân thủ nghiêm ngặt năm thuộc tính cây đỏ đen. Các quy tắc này đảm bảo rằng đường đi dài nhất từ gốc đến bất kỳ lá nào không bao giờ dài hơn hai lần đường đi ngắn nhất. Điều này giữ cho cây luôn ở trạng thái "gần cân bằng", từ đó đảm bảo hiệu suất O(log n). Các thuộc tính này không chỉ định nghĩa cấu trúc của cây mà còn là kim chỉ nam cho các thuật toán cân bằng cây khi thực hiện chèn hoặc xóa. Mỗi khi một thao tác làm thay đổi cấu trúc cây, các thuật toán sẽ kiểm tra và thực hiện các phép xoay hoặc đổi màu node để khôi phục lại tất cả năm thuộc tính. Việc duy trì các quy tắc này là chìa khóa để Cây Đỏ Đen trở thành một trong những cấu trúc dữ liệu và giải thuật hiệu quả và được sử dụng rộng rãi nhất cho các bài toán tìm kiếm động.

3.1. Quy tắc 1 3 Các quy định về màu sắc của node

Ba quy tắc đầu tiên của thuật toán cây đỏ đen thiết lập nền tảng về màu sắc. Quy tắc 1: Mỗi node phải là ĐỎ hoặc ĐEN. Quy tắc 2: Node gốc của cây luôn có màu ĐEN. Quy tắc này đảm bảo tính nhất quán từ điểm bắt đầu của cây. Quy tắc 3: Tất cả các node lá (thường là các node NIL hoặc NULL) đều có màu ĐEN. Điều này giúp đơn giản hóa các thuật toán vì mọi đường đi đều kết thúc tại một node ĐEN. Những quy tắc này là cơ sở để xây dựng các thuộc tính phức tạp hơn liên quan đến sự cân bằng của cây.

3.2. Quy tắc 4 Tính chất của node Đỏ

Quy tắc 4 là một trong những quy định quan trọng nhất: Nếu một node có màu ĐỎ, thì cả hai con của nó phải có màu ĐEN. Quy tắc này có một hệ quả trực tiếp là không bao giờ có hai node ĐỎ liên tiếp trên cùng một đường đi từ gốc đến lá. Điều này ngăn chặn việc các nhánh cây phát triển quá dài một cách mất kiểm soát. Khi chèn node vào cây đỏ đen, node mới thường được gán màu ĐỎ. Nếu cha của nó cũng là ĐỎ, một "xung đột đỏ-đỏ" xảy ra, và đây chính là lúc các thao tác khôi phục như xoay và đổi màu được kích hoạt để duy trì thuộc tính này.

3.3. Quy tắc 5 Yếu tố chiều cao đen của cây Black Height

Quy tắc 5 là quy tắc đảm bảo sự cân bằng của cây: Mọi đường đi đơn giản từ một node đến các node lá hậu duệ của nó đều chứa cùng một số lượng node ĐEN. Số lượng node ĐEN này được gọi là chiều cao đen của cây (black-height). Thuộc tính này, kết hợp với Quy tắc 4, buộc cây phải duy trì sự cân bằng. Nó đảm bảo rằng không có đường đi nào dài gấp đôi bất kỳ đường đi nào khác. Ví dụ, đường đi ngắn nhất chỉ chứa các node ĐEN, trong khi đường đi dài nhất có thể xen kẽ các node ĐỎ và ĐEN. Vì số node ĐEN là như nhau, và không có hai node ĐỎ liên tiếp, đường đi dài nhất chỉ có thể dài tối đa gấp đôi đường đi ngắn nhất. Đây là cốt lõi của sự đảm bảo hiệu suất O(log n).

IV. Hướng dẫn các thao tác cân bằng chính trên Cây Đỏ Đen

Để duy trì 5 thuộc tính cốt lõi, Cây Đỏ Đen sử dụng hai thao tác cơ bản nhưng cực kỳ mạnh mẽ: phép xoay và phép đổi màu. Khi một node được chèn hoặc xóa, cây có thể vi phạm một hoặc nhiều quy tắc. Lúc này, thuật toán cân bằng cây sẽ được kích hoạt để tái cấu trúc lại các node xung quanh khu vực thay đổi. Phép xoay (rotation) thay đổi cấu trúc liên kết cha-con giữa các node để giảm chiều cao của các nhánh dài. Phép đổi màu (recoloring) thay đổi thuộc tính màu của các node để giải quyết các xung đột, chẳng hạn như hai node ĐỎ liền kề. Sự kết hợp thông minh giữa phép xoay trái, phép xoay phảiđổi màu node giúp cây nhanh chóng quay trở lại trạng thái hợp lệ, đảm bảo rằng độ phức tạp thời gian của các thao tác luôn được giữ ở mức O(log n). Đây là những kỹ thuật nền tảng trong mọi Red-Black Tree implementation.

4.1. Kỹ thuật xoay cây Phép xoay trái và phép xoay phải

Phép xoay là một thao tác cục bộ trên cây giúp thay đổi cấu trúc mà không làm mất đi thuộc tính của cây nhị phân tìm kiếm. Có hai loại xoay: phép xoay trái (left rotation) và phép xoay phải (right rotation). Khi thực hiện xoay trái quanh một node X, node con phải của nó (Y) sẽ trở thành cha mới của X. X trở thành con trái của Y, và cây con trái cũ của Y trở thành cây con phải mới của X. Phép xoay phải là thao tác đối xứng ngược lại. Các phép xoay này rất quan trọng trong việc cân bằng lại cây sau khi chèn hoặc xóa, giúp giảm chiều cao của một nhánh và tăng chiều cao của nhánh khác, đưa cây về trạng thái cân bằng hơn.

4.2. Thao tác chèn node vào cây đỏ đen và các trường hợp xử lý

Việc chèn node vào cây đỏ đen bắt đầu tương tự như trên cây nhị phân tìm kiếm thông thường. Node mới luôn được chèn vào vị trí lá và được tô màu ĐỎ. Việc tô màu ĐỎ giúp không làm thay đổi chiều cao đen của cây (Quy tắc 5). Tuy nhiên, nó có thể vi phạm Quy tắc 4 nếu node cha của nó cũng là ĐỎ (xung đột đỏ-đỏ). Để giải quyết vi phạm này, thuật toán sẽ xem xét màu của node "chú" (uncle - anh em của node cha). Có ba trường hợp chính cần xử lý: 1) Node chú là ĐỎ: Chỉ cần thực hiện đổi màu node cha, ông và chú. 2) Node chú là ĐEN và node mới tạo thành một đường "zic-zắc" với cha và ông: Cần một phép xoay để chuyển thành đường thẳng. 3) Node chú là ĐEN và node mới tạo thành một đường thẳng: Cần một phép xoay và vài lần đổi màu để cân bằng lại cây.

4.3. Nguyên lý xóa node khỏi cây đỏ đen và tái cân bằng

Thao tác xóa node khỏi cây đỏ đen phức tạp hơn đáng kể so với chèn. Vấn đề chính là việc xóa một node ĐEN có thể làm thay đổi chiều cao đen trên một số đường đi, vi phạm Quy tắc 5. Nếu node bị xóa là ĐỎ, cây vẫn giữ nguyên thuộc tính. Nếu node bị xóa là ĐEN, cây sẽ bị mất cân bằng. Thuật toán xử lý bằng cách coi node thay thế (con của node bị xóa) có một màu "đen kép" (double black). Sau đó, một vòng lặp sẽ được thực hiện để di chuyển "đen kép" này lên trên cây, thông qua các phép xoay và đổi màu, cho đến khi nó được hấp thụ (ví dụ gặp một node anh em ĐỎ) hoặc đến gốc. Quá trình này đảm bảo tất cả các quy tắc của cây đỏ đen được khôi phục.

V. Hướng dẫn triển khai Cây Đỏ Đen Java và mô phỏng thuật toán

Việc triển khai Cây Đỏ Đen Java là một bài tập tuyệt vời để hiểu sâu hơn về cấu trúc dữ liệu và giải thuật. Quá trình này bao gồm việc xây dựng một lớp Node trong Java, định nghĩa các thuộc tính cần thiết như khóa, màu, và các con trỏ tới cha, con trái, con phải. Sau đó, các phương thức cho thao tác chính như chèn, xóa và tìm kiếm sẽ được cài đặt. Phần thách thức nhất là cài đặt logic tái cân bằng sau khi chèn và xóa, bao gồm các hàm cho phép xoay trái, phép xoay phải, và các trường hợp xử lý vi phạm thuộc tính. Mô phỏng trực quan quá trình này giúp làm rõ cách thuật toán cân bằng cây hoạt động trong thực tế. Một Red-Black Tree implementation hoàn chỉnh không chỉ là một công cụ mạnh mẽ mà còn là minh chứng cho sự hiểu biết sâu sắc về cách các cấu trúc dữ liệu phức tạp được thiết kế để đảm bảo hiệu suất.

5.1. Xây dựng cấu trúc lớp Node trong Java cho cây đỏ đen

Để bắt đầu triển khai cây đỏ đen Java, bước đầu tiên là tạo một lớp Node trong Java. Lớp này sẽ đại diện cho mỗi phần tử trong cây. Dựa trên tài liệu gốc, cấu trúc này cần các thuộc tính sau: key (hoặc data) để lưu trữ giá trị, color (có thể dùng kiểu boolean hoặc enum để biểu diễn ĐỎ/ĐEN), và ba con trỏ tham chiếu: parent, left, right. Con trỏ parent rất quan trọng vì các thao tác xoay và đổi màu thường yêu cầu truy cập đến node cha và ông. Việc định nghĩa một hằng số cho màu ĐEN và ĐỎ (ví dụ: final boolean RED = true; final boolean BLACK = false;) sẽ giúp mã nguồn trở nên dễ đọc và bảo trì hơn.

5.2. Cài đặt thuật toán cân bằng cây khi chèn Insert Fixup

Sau khi chèn một node mới (màu ĐỎ), cần một phương thức fixupInsert() để kiểm tra và khôi phục các thuộc tính của cây. Thuật toán cân bằng cây này sẽ chạy một vòng lặp while chừng nào node hiện tại chưa phải là gốc và cha của nó có màu ĐỎ. Bên trong vòng lặp, thuật toán sẽ kiểm tra màu của node chú (uncle). Nếu chú là ĐỎ, chỉ cần đổi màu cha, chú thành ĐEN và ông thành ĐỎ, sau đó di chuyển lên node ông để kiểm tra tiếp. Nếu chú là ĐEN, sẽ có hai trường hợp con cần xử lý bằng các phép xoay trái hoặc phép xoay phải kết hợp với đổi màu node để giải quyết xung đột. Cuối cùng, node gốc luôn được đặt lại thành màu ĐEN để đảm bảo Quy tắc 2.

5.3. So sánh với Red Black Tree implementation có sẵn trong Java

Java cung cấp các Red-Black Tree implementation hiệu quả trong thư viện chuẩn của mình, tiêu biểu là java.util.TreeMapjava.util.TreeSet. Các cấu trúc này sử dụng Cây Đỏ Đen để lưu trữ các phần tử theo thứ tự được sắp xếp và đảm bảo hiệu suất O(log n) cho các thao tác put, get, remove, containsKey. Việc tự mình triển khai cây đỏ đen Java mang lại lợi ích học thuật to lớn, giúp hiểu rõ cơ chế hoạt động bên trong. Tuy nhiên, trong các dự án thực tế, việc sử dụng các lớp có sẵn của Java luôn được khuyến khích vì chúng đã được tối ưu hóa cao độ, kiểm thử kỹ lưỡng và xử lý tốt các trường hợp phức tạp.

VI. Kết luận Đánh giá hiệu năng và ứng dụng của Cây Đỏ Đen

Cây Đỏ Đen là một trong những cấu trúc dữ liệu và giải thuật quan trọng và hiệu quả nhất cho việc quản lý dữ liệu động. Ưu điểm lớn nhất của nó là đảm bảo độ phức tạp thời gian cho các thao tác tìm kiếm, chèn và xóa luôn ở mức O(log n) trong cả trường hợp trung bình và xấu nhất. Mặc dù các thuật toán cân bằng của nó có vẻ phức tạp hơn so với cây nhị phân tìm kiếm thông thường, sự đánh đổi này là hoàn toàn xứng đáng để có được hiệu suất ổn định và có thể dự đoán. So với các cây tự cân bằng khác như cây AVL, Cây Đỏ Đen thường thực hiện ít phép xoay hơn trong các thao tác chèn và xóa, làm cho nó trở thành lựa chọn tốt hơn cho các ứng dụng có tần suất ghi dữ liệu cao. Nhờ những đặc tính ưu việt này, Cây Đỏ Đen được ứng dụng rộng rãi trong nhiều lĩnh vực của khoa học máy tính.

6.1. Đánh giá tổng quan về độ phức tạp thời gian O log n

Hiệu năng của Cây Đỏ Đen được đảm bảo bởi các thuộc tính cân bằng của nó. Vì chiều cao của cây luôn được giữ ở mức O(log n), tất cả các thao tác cơ bản đều có độ phức tạp thời gianO(log n). Tìm kiếm chỉ đơn giản là đi từ gốc xuống một lá, mất O(h) = O(log n) thời gian. Chèn bao gồm một lần tìm kiếm O(log n) và một số lượng phép xoay và đổi màu không đổi (O(1) amortized). Tương tự, xóa cũng bao gồm tìm kiếm O(log n) và các thao tác tái cân bằng O(log n). Sự đảm bảo hiệu suất này làm cho Cây Đỏ Đen trở thành một công cụ cực kỳ đáng tin cậy cho các tác vụ đòi hỏi tốc độ xử lý nhanh và ổn định.

6.2. Ứng dụng thực tiễn của Cây Đỏ Đen so với Cây AVL và B Tree

Cây Đỏ Đen được ứng dụng trong nhiều hệ thống thực tế. Nó là nền tảng cho TreeMapTreeSet trong Java, std::mapstd::set trong C++. Các bộ lập lịch (scheduler) trong nhiều hệ điều hành cũng sử dụng nó để quản lý các tiến trình. So với cây AVL, Cây Đỏ Đen nhanh hơn cho các thao tác chèn/xóa vì nó ít chặt chẽ hơn về cân bằng, dẫn đến ít phép xoay hơn. Tuy nhiên, cây AVL lại nhanh hơn cho các thao tác chỉ đọc vì cây của nó cân bằng hơn. So với B-Tree, Cây Đỏ Đen phù hợp hơn cho dữ liệu lưu trữ trong bộ nhớ chính (RAM). Ngược lại, B-Tree được thiết kế tối ưu cho việc truy xuất dữ liệu trên các thiết bị lưu trữ khối như ổ cứng, vì nó giảm thiểu số lần đọc đĩa bằng cách lưu trữ nhiều khóa trong một node.

04/10/2025

Trích đoạn nội dung tài liệu

CHƯƠNG I: TỔNG QUAN VỀ CẤU TRÚC CÂY I. CẤU TRÚC CÂY: 1. ĐỊNH NGHĨA VÀ CÁC KHÁI NIỆM VỀ CÂY: - Cây là một đồ thị liên thông và không có chu trình đơn. - Cây đã được dùng từ năm 1857, khi nhà toán học Anh tên Arthur Cayley dùng cây để xác định những dạng khác nhau của hợp chất hóa học.

Từ đó, cây đã được dùng để giải nhiều bài toán trong nhiều lĩnh vực khác nhau trong đó cây rất hay sử dụng trong Tin học. - Cây là một tập hợp T các phần tử (gọi là nút của cây) trong đó có một nút đặc biệt gọi là nút gốc (root), các nút còn lại được chia thành những tập rời nhau T1, T2, …, Tn theo quan hệ phân cấp trong đó Ti cũng được gọi là một cây. Mỗi nút ở cấp i sẽ quản lý một số nút ở cấp i +1. Quan hệ này người ta còn gọi là quan hệ cha - con.

- Gốc của cây là một đỉnh đặc biệt, thông thường là đỉnh trên cùng. Mức của đỉnh là độ dài đường đi từ gốc đến đỉnh đó. Chiều cao của cây là số mức lớn nhất của nút có trên cây đó. * Ví dụ : Đồ thị sau là cây V 1 V V 2 3 V V V V 4 5 6 7 + Ta chọn V1 là gốc có mức 0 thì V2, V3 là những đỉnh mức 1, các đỉnhV4, V5, V6, V7 có mức 2, và chiều cao của cây là 2.

- Rừng là đồ thị mà mỗi thành phần liên thông là cây. - Một nút là một cây. Nút đó cũng gọi là gốc của cây ấy. - Bậc của một nút là số cây con của nút đó.

- Bậc của một cây là bậc lớn nhất của các nút trong cây (số cây con tối đa của một nút thuộc cây). - Cây có bậc n thì gọi là cây n-phân. Cây n-phân là cây mà mọi đỉnh có tối đa n con và có ít nhất một đỉnh có n con. - Cây n-phân đầy đủ là cây mà mọi đỉnh trong có đúng n con.

- Cây cân bằng là cây mà mọi đỉnh lá có mức là h hay h-1, trong đó h là chiều cao của cây. - Đỉnh lá là đỉnh có bậc 1 còn được gọi là lá. Thường dùng cho cây có gốc, khi đó lá là đỉnh không có con. - Nút gốc là nút không có nút cha.

- Các nút không có nút con được gọi là nút lá. - Nút nhánh là nút có bậc khác 0 và không phải là gốc. - Ta quy ước: Một cây không có nút nào được gọi là cây rỗng (null tree). - Độ dài đường đi từ gốc đến nút x: Px = số cạnh cần đi qua kể từ gốc đến x.

SƠ ĐỒ CẤU TRÚC CÂY: A Gốc Cạnh Nút C B G H D E F Lá 3. ỨNG DỤNG CẤU TRÚC CÂY: - Xây dựng các thuật toán rất có hiệu quả để định vị các phần tử trong một danh sách. - Xây dựng các mạng máy tính với chi phí rẻ nhất cho các đường điện thoại nối các máy phân tán. - Cây cũng được dùng để tạo ra các mã có hiệu quả để lưu trữ và truyền dữ liệu.

- Cấu trúc cây được ứng dụng trong các giải thuật tìm kiếm, giải thuật sắp xếp và nhiều bài toán khác. - Cây dùng để biểu diễn bài toán quyết định (cây quyết định), biểu diễn quá trình tính toán các biểu thức đại số. MỘT SỐ VÍ DỤ VỀ ĐỐI TƯỢNG CÁC CẤU TRÚC DẠNG CÂY: 4. Sơ đồ tổ chức của một công ty: BB-Electronic Corp R&D Kinh Tài Sản doanh vụ xuất Nội Quốc TV CD Amplie địa tế r Châu Mỹ Các Âu nước 4.

Mục lục một quyển sách: Student Guide Giới Điể Môi Chương trình thiệu m trường mẫu Bài Thực Thi tập hành 4. Biểu diễn biểu thức số học dưới dạng cây: x + y * (z - t) + u / v. NHẬN XÉT: - Trong cấu trúc cây không tồn tại chu trình. - Tổ chức một cấu trúc cây cho phép truy cập nhanh đến các phần tử của nó.

TÌM HIỂU CÂY NHỊ PHÂN : 1. ĐỊNH NGHĨA : - Cây nhị phân là một dạng cấu trúc cây quan trọng, mỗi nút của nó chỉ có tối đa hai nút con. - Với mỗi nút trên cây nhị phân, cây con xuất phát từ nút con trái gọi là cây con trái và cây con xuất phát từ nút con phải gọi là cây con phải của nó. Như vậy, cây nhị phân là cây có thứ tự.

MỘT SỐ DẠNG ĐẶC BIỆT CỦA CÂY NHỊ PHÂN : A A A A B B B B C C C C D D D D A A B C B C D E F G D E F G H I J A f) e) B C G D E F J g) I H - Các cây a), b), c), d) được gọi là cây nhị phân suy biến. + Cây a) được gọi là cây lệnh trái. + Cây b) được gọi là cây lệnh phải. + Cây c), d) được gọi là cây zic-zắc.

- Cây e) được gọi là cây nhị phân hoàn chỉnh. Như vậy, cây nhị phân hoàn chỉnh là cây nhị phân đầy đủ mà tất cả các lá có cùng một mức. - Cây f) có các nút tối đa ở cả mọi mức nên gọi là cây nhị phân đầy đủ cân bằng. Đó là trường hợp đặc biệt của cây nhị phân hoàn chỉnh.

- Cây g) gọi là cây gần đầy, khác với cây e) ở chỗ các nút ở mức cuối không đạt về phía trái. 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 k (k≥1) trên cây nhị phân là 2k-1. - Số lượng tối đa các nút trên cây nhị phân độ cao h là 2h-1 (h≥1).

 Chứng minh : 2) Chứng minh bằng quy nạp : Ta biết : - Ở mức 1 : k=1, cây nhị phân có tối đa 1=20 nút. - Ở mức 2 : k=2, cây nhị phân có tối đa 2=21 nút. Giả sử kết quả đúng với mức k-1, nghĩa là ở mức này cây nhị phân có tối đa là 2k-2 nút. Mỗi nút ở mức k-1 sẽ có tối đa hai con, do đó 2k-2 nút ở mức k-1 sẽ cho : 2k-2 * 2=2k-1 nút tối đa ở mức k (Tính chất 2 được chứng minh).

3) 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 2) 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 +. CHƯƠNG II: CÂY NHỊ PHÂN TÌM KIẾM I. MỘT SỐ KHÁI NIỆM: - Cây nhị phân tìm kiếm (Binary Search Tree) là một cấu trúc dữ liệu rất thuận lợi cho bài toán tìm kiếm.

- Cây nhị phân tìm kiếm là cây nhị phân trong đó dữ liệu được gán với các nút và dữ liệu được sắp xếp theo khóa sao cho khóa tại mỗi nút của cây lớn hơn khóa của các nút cây con bên trái và nhỏ hơn hoặc bằng khóa của các nút cây con bên phải. - Nếu số nút trên cây là N thì chi phí tìm kiếm trung bình chỉ khoảng log2N. - Cây tìm kiếm ứng với n khóa k1, k2, …, kn là cây nhị phân mà mỗi nút đều được gán một khóa sao cho với mỗi nút k: + Mọi khóa trên cây con trái đều nhỏ hơn khóa trên nút k. + Mọi khóa trên cây con phải đều lớn hơn khóa trên nút k.

- 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. SƠ ĐỒ CÂY NHỊ PHÂN TÌM KIẾM: 44 Cây con Cây con trái phải 18 88 13 37 59 10 8 15 23 40 55 71 III. CẤU TRÚC DỮ LIỆU: Typedef struct NODE { int data; NODE* left; NODE* right; }; Typedef struct NODE* TREE; TREE root; IV. CÁC THAO TÁC TRÊN CÂY NHỊ PHÂN TÌM KIẾM: 1.

Khởi tạo cây Binary Search Tree: 1. Khởi tạo cây Binary Search Tree: Cho con trỏ quản lý địa chỉ nút gốc về con trỏ NULL. void init (Node &root) { root = NULL; } 1. Tạo Node: Node* GetNode (int x) { p = new Node; if (p!= NULL) { p→ left = NULL; p→ right = NULL; p→ data = x; } return (p); } 1.

Tạo cây nhị phân tìm kiếm: - Ta có thể tạo cây nhị phân tìm kiếm bằng cách lặp lại quá trình thêm một phần tử vào một cây rỗng. void creatTree (Tree &root) { int x, n; cout << “ nhap n= ”; cin>> n; for (int i=1; i<=n; i++) { cout << “ nhap gia tri: ”; cin>> x; insertTree (root.x); } } - Ví dụ về tạo cây nhị phân tìm kiếm: 25 37 10 18 29 50 3 1 6 5 12 20 35 13 32 41 25 10 37 2. Duyệt cây nhị phân tìm kiếm: - Khi một cây nhị phân tìm kiếm được tạo ra, tất cả các nút có thể được duyệt theo thứ tự giữa nhờ duyệt đệ quy cây con bên trái, in nút đang duyệt, rồi duyệt đệ quy cây con bên phải, tiếp tục làm như vậy với mỗi nút của cây trong quá trình đệ quy. Với mọi cây nhị phân, cây có thể được duyệt theo thứ tự trước hoặc theo thứ tự sau, cả hai cách đều hữu dụng với cây nhị phân tìm kiếm.

- Phép duyệt có độ phức tạp là Ω(n), vì nó phải duyệt qua tất cả các nút. Độ phức tạp trên cũng là O(n). - Khi duyệt theo thứ tự giữa, trình tự các nút duyệt qua sẽ cho ta một dãy các nút theo thứ tự tăng dần của khóa. Duyệt theo thứ tự trước (Node - Left - Right): Duyệt nút gốc, duyệt cây con bên trái, duyệt cây con bên phải.

Duyệt theo thứ tự giữa (Left - Node - Right): Duyệt cây con bên trái, duyệt nút gốc, duyệt cây con bên phải. Duyệt theo thứ tự sau (Left - Right - Node): Duyệt cây con bên trái, duyệt cây con bên phải, duyệt nút gốc. void LRN (TREE root) { if (root!=NULL) { LRN (root→ left); LRN (root→ right); cout << root→ data<< “ “; } } 3. Tìm một phần tử x trong cây:  Giải thuật tìm kiếm: + Đầu vào: Cây nhị phân tìm kiếm T và khóa K.

+ Đầu ra: Kết luận K không có trong cây T hoặc xác định vị trí chứa khóa K + Phương pháp: (1) Xuất phát: Đặt nút v ban đầu là gốc.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ