Cây vật tế thần có thể có thuật toán xác định số dư đơn giản nhất để hiểu. Nếu bất kỳ chèn nào làm cho nút mới quá sâu, nó sẽ tìm thấy một nút xung quanh đó để cân bằng lại, bằng cách xem cân bằng trọng lượng thay vì cân bằng chiều cao. Quy tắc cho dù để cân bằng lại trên xóa cũng đơn giản. Nó không lưu trữ bất kỳ thông tin phức tạp nào trong các nút. Thật khó để chứng minh rằng đó là chính xác, nhưng bạn không cần điều đó để hiểu thuật toán ...
Tuy nhiên, không giống như AVL, nó không cân bằng độ cao ở mọi thời điểm. Giống như màu đỏ-đen, sự mất cân bằng của nó bị giới hạn, nhưng không giống như màu đỏ-đen, nó có thể điều chỉnh được với một tham số, vì vậy với hầu hết các mục đích thực tế, nó trông cân bằng như bạn cần. Tôi nghi ngờ rằng nếu bạn điều chỉnh nó quá chặt chẽ, mặc dù, nó kết thúc lên như xấu hoặc tồi tệ hơn AVL cho trường hợp xấu nhất chèn.
Trả lời câu hỏi chỉnh sửa
tôi sẽ cung cấp đường dẫn cá nhân của tôi để tìm hiểu cây AVL.
Trước tiên, bạn phải hiểu xoay vòng của cây là gì, vì vậy hãy bỏ qua mọi thứ khác bạn đã từng nghe đến thuật toán AVL và hiểu điều đó. Đi thẳng vào đầu của bạn, đó là một vòng quay đúng và đó là vòng quay trái, và mỗi cái sẽ làm gì với cây, nếu không mô tả của các phương pháp chính xác sẽ chỉ gây nhầm lẫn cho bạn.
Tiếp theo, hiểu rằng mẹo để cân bằng cây AVL là mỗi nút ghi lại trong đó sự khác biệt giữa chiều cao của các subtrees trái và phải của nó. Định nghĩa của 'chiều cao cân bằng' là đây là giữa -1 và 1 bao gồm cho mỗi nút trong cây.
Tiếp theo, hãy hiểu rằng nếu bạn đã thêm hoặc xóa một nút, bạn có thể không cân bằng cây. Nhưng bạn chỉ có thể thay đổi số dư của các nút là tổ tiên của nút bạn đã thêm hoặc xóa. Vì vậy, những gì bạn sẽ làm là làm việc theo cách của bạn sao lưu cây, sử dụng phép quay để cân bằng bất kỳ nút không cân bằng bạn tìm thấy, và cập nhật điểm số dư của họ, cho đến khi cây được cân bằng một lần nữa.
Phần cuối cùng của việc hiểu nó là tra cứu một tham chiếu phong nha các phép quay cụ thể được sử dụng để cân bằng lại mỗi nút bạn thấy: đây là "kỹ thuật" của nó trái ngược với khái niệm cao. Bạn chỉ phải nhớ các chi tiết trong khi sửa đổi mã cây AVL hoặc có thể trong quá trình kiểm tra cấu trúc dữ liệu. Đã nhiều năm kể từ lần cuối tôi có mã cây AVL nhiều như mở trong trình gỡ rối - việc triển khai có xu hướng đến một điểm mà chúng hoạt động và sau đó vẫn hoạt động. Vì vậy, tôi thực sự không nhớ. Bạn có thể sắp xếp công việc trên một bảng bằng cách sử dụng một vài chip poker, nhưng thật khó để chắc chắn bạn đã thực sự có tất cả các trường hợp (không có nhiều). Tốt nhất là tìm nó.
Sau đó, doanh nghiệp dịch tất cả thành mã.
Tôi không nghĩ rằng việc xem danh sách mã sẽ giúp rất nhiều với bất kỳ giai đoạn nào ngoại trừ giai đoạn cuối cùng, vì vậy hãy bỏ qua chúng. Ngay cả trong trường hợp tốt nhất, nơi mã được viết rõ ràng, nó sẽ trông giống như một mô tả sách giáo khoa của quá trình, nhưng không có sơ đồ. Trong một trường hợp điển hình hơn đó là một mớ hỗn độn của thao tác cấu trúc C. Vì vậy, chỉ cần dính vào các cuốn sách.
Bạn có muốn cây * hoàn toàn cân bằng không? Các thuật toán phổ biến nhất đảm bảo rằng một cây có phần cân bằng. Ví dụ, cây đỏ đen đảm bảo rằng chiều sâu của nút lá sâu nhất không quá hai lần chiều sâu của nút lá cạn nhất –
Ngoài ra, bạn đang tìm kiếm một thuật toán lấy một cây và cân bằng nó, hoặc một số cân bằng như một phần của các hoạt động của cây, như chèn, xóa, v.v. –
"hoàn toàn" phải được xác định. Tuy nhiên, trong bối cảnh cây nhị phân, định nghĩa duy nhất có nghĩa là cây nhị phân có chiều cao loga, phải không? –