Cây tìm kiếm nhị phân trong c++
Chào ace, bài này chúng ta sẽ tìm hiểu về Binary Search Tree trong series tự học về cấu trúc dữ liệu(CTDL) và giải thuật, sau đây cafedev sẽ giới thiệu và chia sẻ chi tiết(khái niệm, mức độ phức tạp, ứng dụng) Sau đây là định nghĩa về Cây tìm kiếm nhị phân (BST) – Cây nhị phân tìm kiếm theo Wikipedia Cây tìm kiếm nhị phân, là một cấu trúc cây dữ liệu nhị phân dựa trên cơ sở các nút, Cây tìm kiếm nhị phân có các tính chất sau – Phần cây con bên trái của một nút bất kỳ chỉ chứa các nút có khóa (giá trị/dữ liệu) nhỏ hơn khóa của nút đó – Phần cây bên phải của một nút bất kỳ chỉ chứa các nút có khóa (giá trị/dữ liệu) lớn hơn khóa của nút đó – Mỗi phần cây con bên trái và phần cây con bên phải cũng phải là Cây tìm kiếm nhị phân. Không thể lặp lại các nút Các tính chất trên của Cây tìm kiếm nhị phân cung cấp một thứ tự sắp xếp áp dụng lên các nút, để các thao tác tìm kiếm, tìm giá trị nhỏ nhất, tìm giá trị lớn nhất có thể được thực hiện nhanh chóng. Nếu không có thứ tự nào áp dụng lên các nút, chúng ta có thể phải so sánh mọi khóa để tìm kiếm một khóa cụ thể 1. Search for a keyĐể tìm kiếm một giá trị, nếu đã có một mảng đã được sắp xếp, chúng ta có thể thực hiện tìm kiếm nhị phân (binary search). Giả sử chúng ta muốn tìm kiếm một số tìm kiếm trong mảng, khi thực hiện điều này bằng cách tìm kiếm nhị phân phân, trước hết chúng ta sẽ xác định toàn bộ mảng này là không gian tìm kiếm và số cần tìm chỉ có thể tồn tại tại . Tiếp theo, chúng ta sẽ so sánh số cần tìm/phần tử cần tìm với phần tử nằm giữa không gian tìm kiếm hoặc hoặc với số trung vị (trung vị), và nếu giá trị cần tìm nhỏ hơn, chúng ta sẽ tiếp tục . Trong tìm kiếm nhị phân tìm kiếm, chúng ta bắt đầu với 'n' phần tử trong không gian tìm kiếm, và sau đó nếu phần tử ở giữa không phải là phần tử đang cần tìm, chúng ta sẽ không giảm thời gian tìm kiếm thành 'n/ Thao tác tìm kiếm trong Binary Search Tree cũng sẽ tương tự như vậy. Giả sử, chúng ta muốn tìm kiếm một số cụ thể, chúng ta sẽ bắt đầu tìm kiếm từ nút gốc và sau đó so sánh giá trị cần tìm với giá trị của nút gốc, nếu chúng bằng nhau tức là chúng ta đã tìm thấy phần . Việc tìm kiếm một phần tử trong Cây tìm kiếm nhị phân về cơ bản chính là quá trình duyệt/tìm kiếm này, trong đó ở mỗi bước chúng ta sẽ đi tiếp hoặc là theo hướng sang trái hoặc sang phải, và làm điều đó ở mỗi bước . Nếu cây ban đầu đã được cân bằng rồi, chúng ta coi một cây đã được cân bằng khi có sự khác biệt giữa chiều cao của phần cây con bên trái và phần cây con bên phải không lớn hơn một, chúng ta sẽ bắt đầu với . Quá trình tìm kiếm ở đây chính là một tìm kiếm nhị phân tìm kiếm, và đó là lý do vì sao cái tên Cây tìm kiếm nhị phân – Cây tìm kiếm nhị phân xuất hiện Sau đây sẽ là đoạn mã ví dụ cài đặt thao tác tìm kiếm một công cụ khóa có thể ở trong Cây tìm kiếm nhị phân được chọn Search an tool can in a BST by C/C++
Tìm kiếm một khóa cụ thể trong BST bằng Java
Tìm kiếm một khóa cụ thể trong BST bằng Python
Ví dụ minh họa tìm khóa tìm kiếm có giá trị 6 trong cây bên dưới 1. Bắt đầu từ nút gốc 2. So sánh giá trị muốn tìm với giá trị của nút gốc, nếu nhỏ hơn gốc thì tiếp tục đệ quy cho phần cây con bên trái của cây ban đầu, đảo ngược, nếu lớn hơn gốc thì đệ quy với phần cây con bên phải của nút 3. Nếu phần tử cần tìm được tìm thấy thì return true, ngược lại return false 2. Chèn thêm một khóa vào BSTMột khóa mới sẽ luôn được đưa vào BST dưới dạng một lá nút. Chúng ta sẽ bắt đầu tìm kiếm từ nút gốc cho đến khi gặp được nút lá. Khi tìm thấy một nút lá, nút mới sẽ được thêm vào BST làm nút con của nút lá này 100 100 / \ Chèn 40 / \ 20 500 ———> 20 500 / \ / \ 10 30 10 30 \ 40 Sau đây sẽ là các đoạn mã ví dụ cài đặt thao tác chèn thêm một khóa mới vào trong Cây tìm kiếm nhị phân được chọn Chèn thêm nút mới vào BST bằng ngôn ngữ C
Chèn thêm nút mới vào BST bằng ngôn ngữ C++
Chèn thêm nút mới vào BST bằng ngôn ngữ Java
Chèn thêm nút mới vào BST bằng ngôn ngữ Python
Kết quả trong ra là 20 30 40 50 60 70 80 Ví dụ minh họa chèn thêm nút có giá trị 2 vào cây bên dưới 1. Bắt đầu từ nút gốc 2. So sánh giá trị của nút mới với giá trị của nút gốc, nếu nhỏ hơn gốc thì tiếp tục đệ quy cho phần cây con bên trái của cây ban đầu, ngược lại, nếu lớn hơn gốc thì đệ quy với phần cây con bên phải 3. Sau khi đi đến cuối của cây, chỉ cần thêm nút mới vào bên trái (nếu nút mới có giá trị nhỏ hơn nút hiện tại), đảo ngược, chèn nút mới vào bên phải của nút hiện tại Độ phức tạp về thời gian Độ phức tạp về thời gian trong trường hợp xấu nhất của thao tác tìm kiếm và thêm nút mới là O(h), trong đó h là chiều cao của Cây tìm kiếm nhị phân. Trong trường hợp xấu nhất này, chúng ta có thể duyệt từ nút gốc để đến nút lá sâu nhất của cây. Chiều cao của một cây lệch (cây lệch) có thể trở thành n, và độ phức tạp về thời gian của thao tác tìm kiếm và thêm nút mới có thể trở thành O(n) Một số sự thật thú vị – Browse Binary Search Tree theo thứ tự luôn luôn tạo ra các đầu ra đã được sắp xếp – Chúng ta có thể xây dựng Cây tìm kiếm nhị phân bằng một trong kiểu duyệt cây Pre-order (Duyệt cây thứ tự trước, theo kiểu Nút -> Trái -> Phải), Pos-order (Duyệt cây thứ tự sau, theo kiểu – With nkey/n giá trị riêng biệt, Số lượng các cây Tìm kiếm nhị phân Cây độc nhất là Số Catalan Nguồn và Tài liệu tiếng anh tham khảo
Tài liệu từ cafedev
Nếu thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa |