Nhiều thuật toán sẽ chỉ định rằng các bản sao được loại trừ. Ví dụ, các thuật toán ví dụ trong sách Thuật toán MIT thường trình bày các ví dụ mà không trùng lặp. Việc thực hiện các bản sao khá đơn giản (như là một danh sách tại nút hoặc theo một hướng cụ thể.)
Hầu hết (mà tôi đã thấy) chỉ định trẻ trái là <= và trẻ phải là>. Nói một cách thực tế, một BST cho phép một trong hai con phải hoặc trái bằng với nút gốc, sẽ yêu cầu các bước tính toán bổ sung để hoàn thành tìm kiếm trong đó cho phép các nút trùng lặp.
Tốt nhất là sử dụng một danh sách tại nút để lưu trữ các bản sao, vì việc chèn giá trị '=' vào một bên của nút yêu cầu viết lại cây ở phía đó để đặt nút là con hoặc nút được đặt là grand -child, tại một số điểm dưới đây, giúp loại bỏ một số hiệu quả tìm kiếm.
Bạn phải nhớ, hầu hết các ví dụ trong lớp học được đơn giản hóa để miêu tả và đưa ra khái niệm. Họ không đáng ngồi xổm trong nhiều tình huống thực tế. Nhưng tuyên bố, "mọi phần tử đều có một khóa và không có hai phần tử nào có cùng một khóa", không bị vi phạm bởi việc sử dụng danh sách tại nút phần tử.
Vì vậy, đi với những gì cuốn sách cấu trúc dữ liệu của bạn nói!
Biên tập:
Định nghĩa phổ quát của Cây tìm kiếm nhị phân liên quan đến việc lưu trữ và tìm kiếm khóa dựa trên việc truyền tải cấu trúc dữ liệu theo một trong hai hướng. Theo nghĩa thực dụng, điều đó có nghĩa là nếu giá trị là <>, bạn đi qua cấu trúc dữ liệu theo một trong hai "hướng". Vì vậy, theo nghĩa đó, các giá trị trùng lặp không có ý nghĩa gì cả.
Điều này khác với BSP hoặc phân vùng tìm kiếm nhị phân, nhưng không khác nhau lắm. Thuật toán tìm kiếm có một trong hai hướng cho 'du lịch', hoặc nó đã được thực hiện (thành công hay không.) Vì vậy, tôi xin lỗi rằng câu trả lời ban đầu của tôi không đề cập đến khái niệm 'định nghĩa phổ quát', vì các bản sao thực sự là một sự khác biệt chủ đề (một cái gì đó bạn xử lý sau khi tìm kiếm thành công, không phải là một phần của tìm kiếm nhị phân.)