Xây dựng một cây nhị phân tìm kiếm

Một phần của tài liệu cấu trúc dữ liệu chuong 9 (Trang 28 - 30)

Giả sử chúng ta có một danh sách các dữ liệu đã có thứ tự, hoặc có thể là một file các bản ghi có các khóa đã có thứ tự. Nếu chúng ta muốn sử dụng các dữ liệu

này để tìm kiếm thông tin, hoặc thực hiện một số thay đổi nào đó, chúng ta có thể tạo một cây nhị phân tìm kiếm từ danh sách hoặc file này.

Chúng ta có thể bắt đầu từ một cây rỗng và đơn giản sử dụng giải thuật thêm vào cây để thêm từng phần tử. Tuy nhiên do các phần tử đã có thứ tự, cây tìm kiếm của chúng ta sẽ trở thành một chuỗi các mắc xích rất dài, và việc sử dụng nó trở nên rất chậm chạp với tốc độ của tìm tuần tự chứ không phải là tìm nhị phân. Thay vào đó chúng ta mong muốn rằng các phần tử sẽ được xây dựng thành một cây càng rậm rạp càng tốt, có nghĩa là cây không bị cao quá, để giảm thời gian tạo cây cũng như thời gian tìm kiếm. Chẳng hạn, khi số phần tử n bằng 31, chúng ta muốn cây sẽ có được dạng như hình 9.12. Đây là cây có được sự cân bằng tốt nhất giữa các nhánh, và được gọi là cây nhị phân đầy đủ.

Trong hình 9.12, các phần tử được đánh số theo thứ tự mà giá trị của chúng tăng dần. Đây cũng là thứ tự tự duyệt cây inorder, và cũng là thứ tự mà chúng sẽ được thêm vào cây theo giải thuật của chúng ta. Chúng ta cũng sẽ dùng các con số này như là nhãn của các nút trong cây. Nếu chúng ta xem xét kỹ sơ đồ trên, chúng ta có thể nhận thấy một đặc tính quan trọng của các nhãn. Các nhãn của các nút lá chỉ toàn số lẻ. Các nhãn của các nút ở mức trên các nút lá một bậc là 2, 6, 10, 14, 18, 22, 26, 30. Các số này đều gấp đôi một số lẻ, có nghĩa chúng đều là số chẵn, và chúng đều không chia hết cho 4. Trên mức cao hơn một bậc các nút có nhãn 4, 12, 20 và 28, đây là những con số chia hết cho 4, nhưng không chia hết cho 8. Cuối cùng, các nút ngay dưới nút gốc có nhãn là 8 và 24. và nút gốc có nhãn là 16.

Nếu các nút của một cây nhị phân đầy đủ có các nhãn theo thứ tự duyệt inorder, bắt đầu từ 1, thì nhãn của mỗi nút là một số có số lần chia chẵn cho 2 bằng với hiệu giữa mức của nó với mức của các nút lá.

Như vậy, nếu cho mức của các nút lá là 1, khi thêm một nút mới, dựa vào nhãn của nó chúng ta sẽ tính được mức tương ứng.

Giả sử chúng ta không biết trước số nút sẽ tạo cây. Điều này được giải thích rằng, khi các nút đến từ một file hoặc một danh sách liên kết, chúng ta không có cách gì thuận tiện để đếm trước số nút cả. Điều giả thiết này cũng còn một ưu điểm là chúng ta không cần phải lo lắng về việc số nút có phải là một số lũy thừa của 2 trừ đi 1 hay không. Trong trường hợp số nút không phải là số lũy thừa của 2 trừ đi 1, cây được tạo ra sẽ không phải là một cây đầy đủ và đối xứng hoàn toàn như hình 9.12. Với giả thiết cây sẽ là một cây đầy đủ, chúng ta sẽ đưa dần các nút vào cây, cho đến khi mọi phần tử đã được đưa vào cây, chúng ta sẽ xác định cách để kết thúc việc tạo cây.

Một phần của tài liệu cấu trúc dữ liệu chuong 9 (Trang 28 - 30)