Giá trị của khóa của cây con bên phải lớn hơn hoặc bằng giá trị của khóa của nút cha (gốc) của nó
Do đó, BST chia tất cả các cây con của nó thành hai phân đoạn;
left_subtree (keys) < node (key) ≤ right_subtree (keys)đại diện
BST là tập hợp các nút được sắp xếp theo cách chúng duy trì các thuộc tính BST. Mỗi nút có một khóa và một giá trị liên quan. Trong khi tìm kiếm, khóa mong muốn được so sánh với các khóa trong BST và nếu tìm thấy, giá trị được liên kết sẽ được truy xuất
Sau đây là hình ảnh đại diện của BST −
Chúng tôi quan sát thấy rằng khóa nút gốc (27) có tất cả các khóa có giá trị thấp hơn trên cây con bên trái và các khóa có giá trị cao hơn trên cây con bên phải
Hoạt động cơ bản
Sau đây là các hoạt động cơ bản của cây -
Tìm kiếm - Tìm kiếm một phần tử trong cây
Chèn - Chèn một phần tử vào cây
Pre-order Traversal – Duyệt qua một cây theo cách đặt hàng trước
In-order Traversal − Duyệt cây theo thứ tự
Traversal theo thứ tự sau - Duyệt qua một cây theo cách thức sau khi đặt hàng
Nút
Xác định một nút có một số dữ liệu, tham chiếu đến các nút con bên trái và bên phải của nó
struct node { int data; struct node *leftChild; struct node *rightChild; };Hoạt động tìm kiếm
Bất cứ khi nào một phần tử được tìm kiếm, hãy bắt đầu tìm kiếm từ nút gốc. Sau đó, nếu dữ liệu nhỏ hơn giá trị chính, hãy tìm kiếm phần tử trong cây con bên trái. Mặt khác, tìm kiếm phần tử trong cây con bên phải. Thực hiện theo cùng một thuật toán cho mỗi nút
thuật toán
struct node* search(int data){ struct node *current = root; printf("Visiting elements: "); while(current->data != data){ if(current != NULL) { printf("%d ",current->data); //go to left tree if(current->data > data){ current = current->leftChild; } //else go to right tree else { current = current->rightChild; } //not found if(current == NULL){ return NULL; } } } return current; }Thao tác chèn
Bất cứ khi nào một phần tử được chèn vào, trước tiên hãy xác định vị trí thích hợp của nó. Bắt đầu tìm kiếm từ nút gốc, sau đó nếu dữ liệu nhỏ hơn giá trị khóa, hãy tìm vị trí trống trong cây con bên trái và chèn dữ liệu. Nếu không, hãy tìm vị trí trống trong cây con bên phải và chèn dữ liệu
Cây là một cấu trúc dữ liệu phi tuyến tính trong đó dữ liệu được lưu trữ phi tuyến tính. Một cây được sử dụng để biểu diễn dữ liệu ở dạng phân cấp. Nó có một tập hợp các đối tượng lưu trữ dữ liệu vào nó được gọi là các nút
Hình ảnh trên đại diện cho một cây trong đó bốn nút được kết nối theo cấu trúc phân cấp. Mỗi nút chứa một số dữ liệu số nguyên và địa chỉ của các nút con của nó
Bây giờ, trước khi tìm hiểu về cây tìm kiếm nhị phân, chúng ta hãy xem cây nhị phân và biểu diễn của nó
Theo dõi ngay. Cấu trúc dữ liệu trong C Newsletter. Chủ đề quan trọng Bản tin
quảng cáo
quảng cáo
Cây nhị phân là gì?
Cây nhị phân là loại cây mà mỗi nút chứa nhiều nhất hai con. Một nút chứa địa chỉ của nút con bên trái và bên phải trong biểu diễn danh sách liên kết của cây nhị phân
Nếu một nút không chứa một trong hai nút con, thì trường của nút đó sẽ là NULL. Nếu không có nút con nào cho nút đó thì nó được gọi là nút Lá
Nhận Giấy khen miễn phí về Cấu trúc dữ liệu ngay bây giờ
Cây tìm kiếm nhị phân là gì?
Cây tìm kiếm nhị phân là một cây đặc biệt trong đó một số thứ tự được tuân theo. Mỗi nút cha có nhiều nhất hai nút con, trong đó nút con bên trái có giá trị thấp hơn trong khi nút con bên phải có giá trị cao hơn nút cha của chúng. Quy tắc này được áp dụng cho tất cả các cây con bên trái và bên phải
Giải pháp vấn đề
Chúng tôi sẽ triển khai cây tìm kiếm nhị phân bằng danh sách liên kết kép. Danh sách liên kết kép chứa địa chỉ của con trái và con phải và dữ liệu của nút. Con trỏ bên trái của nút trỏ đến các nút con bên trái và con trỏ bên phải trỏ đến các nút con bên phải
quảng cáo
Đây là biểu diễn của một nút sử dụng danh sách liên kết kép
struct node { int data; struct node* left; struct node* right; };
Biểu diễn Danh sách liên kết kép của nút BST
trái*dữ liệu phải*Chương trình/Mã nguồn
Đây là mã nguồn của chương trình C để thực hiện các hoạt động Cây tìm kiếm nhị phân. Chương trình C được biên dịch thành công và chạy trên hệ thống Linux. Đầu ra chương trình cũng được hiển thị bên dưới
quảng cáo
- /*
- * C program to implement the Binary Search Tree
- */
- #include <stdio.h>
- ________số 8
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 0
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 1
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- /*0
- /*1
- /*2
- /*3
- /*5
- /*6
- /*8
- /*9
- * C program to implement the Binary Search Tree 0
- * C program to implement the Binary Search Tree 1
- * C program to implement the Binary Search Tree 2
- * C program to implement the Binary Search Tree 3
- * C program to implement the Binary Search Tree 4
- * C program to implement the Binary Search Tree 5
- * C program to implement the Binary Search Tree 6
- * C program to implement the Binary Search Tree 7
- * C program to implement the Binary Search Tree 8
- */0
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- */2
- */3
- /*0
- */5
- */7
- */8
- */9
- #include <stdio.h>0
- #include <stdio.h>1
- #include <stdio.h>2
- #include <stdio.h>3
- #include <stdio.h>4
- #include <stdio.h>5
- #include <stdio.h>6
- #include <stdio.h>7
- #include <stdio.h>8
- #include <stdio.h>9
- #include <stdlib.h>1
- #include <stdlib.h>2
- #include <stdlib.h>3
- #include <stdlib.h>5
- #include <stdlib.h>6
- #include <stdlib.h>7
- #include <stdlib.h>8
- #include <stdlib.h>9
- 0
- 2
- #include <stdlib.h>8
- 4
- 0
- 7
- #include <stdlib.h>8
- 9
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 00
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 01
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 02
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 03
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 00
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 05
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 02
- 0
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 09
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 10
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 11
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 00
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 13
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 02
- 0
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 17
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 18
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 11
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 00
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 21
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 02
- 0
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 25
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 26
- 0
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 29
- /*00
- 0
- /*03
- /*04
- 0
- /*07
- /*08
- 0
- /*11
- /*12
- 0
- /*14
- /*16
- /*17
- /*18
- /*19
- /*21
- /*22
- /*24
- /*25
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- /*27
- /*29
- */8
- /*31
- /*32
- /*19
- /*35
- /*36
- /*37
- /*39
- /*22
- /*42
- /*43
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- /*45
- /*47
- */8
- /*49
- /*50
- #include <stdlib.h>6
- /*52
- /*53
- /*54
- /*14
- /*57
- /*58
- /*60
- /*61
- #include <stdlib.h>6
- /*63
- /*64
- /*65
- /*66
- /*67
- /*68
- /*65
- /*70
- /*67
- /*14
- /*74
- /*75
- #include <stdlib.h>6
- /*77
- /*14
- /*79
- #include <stdlib.h>6
- /*81
- /*14
- /*84
- /*19
- /*22
- /*88
- /*89
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- /*91
- */8
- /*93
- /*19
- /*95
- */8
- /*97
- /*19
- /*99
- */8
- * C program to implement the Binary Search Tree 01
- /*19
- * C program to implement the Binary Search Tree 03
- */8
- * C program to implement the Binary Search Tree 05
- #include <stdlib.h>6
- * C program to implement the Binary Search Tree 07
- * C program to implement the Binary Search Tree 08
- * C program to implement the Binary Search Tree 09
- /*14
- * C program to implement the Binary Search Tree 11
- #include <stdlib.h>6
- * C program to implement the Binary Search Tree 13
- * C program to implement the Binary Search Tree 08
- * C program to implement the Binary Search Tree 09
- /*14
- * C program to implement the Binary Search Tree 17
- * C program to implement the Binary Search Tree 18
- * C program to implement the Binary Search Tree 19
- /*19
- * C program to implement the Binary Search Tree 21
- /*22
- * C program to implement the Binary Search Tree 25
- * C program to implement the Binary Search Tree 26
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- * C program to implement the Binary Search Tree 28
- * C program to implement the Binary Search Tree 30
- */8
- * C program to implement the Binary Search Tree 32
- #include <stdlib.h>6
- * C program to implement the Binary Search Tree 34
- /*14
- * C program to implement the Binary Search Tree 36
- #include <stdlib.h>6
- * C program to implement the Binary Search Tree 38
- /*14
- /*79
- #include <stdlib.h>6
- * C program to implement the Binary Search Tree 42
- /*14
- /*19
- /*21
- /*22
- * C program to implement the Binary Search Tree 48
- * C program to implement the Binary Search Tree 49
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- * C program to implement the Binary Search Tree 51
- * C program to implement the Binary Search Tree 52
- * C program to implement the Binary Search Tree 53
- * C program to implement the Binary Search Tree 54
- /*19
- * C program to implement the Binary Search Tree 56
- /*22
- * C program to implement the Binary Search Tree 59
- * C program to implement the Binary Search Tree 60
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- * C program to implement the Binary Search Tree 51
- * C program to implement the Binary Search Tree 63
- */8
- * C program to implement the Binary Search Tree 65
- /*19
- * C program to implement the Binary Search Tree 56
- /*22
- * C program to implement the Binary Search Tree 70
- * C program to implement the Binary Search Tree 71
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- /*91
- */8
- * C program to implement the Binary Search Tree 75
- /*19
- * C program to implement the Binary Search Tree 77
- * C program to implement the Binary Search Tree 78
- * C program to implement the Binary Search Tree 79
- /*22
- * C program to implement the Binary Search Tree 82
- * C program to implement the Binary Search Tree 83
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- /*91
- */8
- * C program to implement the Binary Search Tree 75
- /*19
- * C program to implement the Binary Search Tree 89
- * C program to implement the Binary Search Tree 90
- * C program to implement the Binary Search Tree 91
- /*22
- * C program to implement the Binary Search Tree 94
- * C program to implement the Binary Search Tree 95
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- /*91
- */8
- * C program to implement the Binary Search Tree 75
- /*19
- */01
- */02
- * C program to implement the Binary Search Tree 89
- /*22
- */06
- */07
- struct node { int data; struct node *leftChild; struct node *rightChild; }; 2
- /*0
- */10
- */11
- */12
- /*22
Giải thích chương trình
Ở đây chúng ta đã thảo luận về các chức năng chính của Cây tìm kiếm nhị phân với sự phức tạp về thời gian và không gian
Chèn một Node mới – phương thức insert()
Để chèn nút mới, chúng ta phải làm theo các bước đã cho
- Tìm nút mà nút mới phải được chèn vào và lưu nút đã truy cập vào biến tạm thời
- Bây giờ, dữ liệu nút mới sẽ được so sánh với tạm thời
- Nếu dữ liệu lớn hơn dữ liệu tạm thời thì hãy chèn nút mới ở bên phải của tạm thời
- Nếu dữ liệu nhỏ hơn thì chèn nút mới ở bên trái của tạm thời
Ví dụ. Hãy chèn nút mới 45 vào Cây tìm kiếm nhị phân đã cho. Chúng tôi có các bước sau để chèn nó vào đúng vị trí
Độ phức tạp về thời gian.
Trường hợp xấu nhất. O(n)
Khi cây tìm kiếm nhị phân trở thành cây lệch thì chúng ta cần duyệt qua từng nút để độ phức tạp thời gian trở thành O(n), trong đó n là số nút.
Trường hợp tốt nhất và trung bình. O(h)
Nói chung, chúng ta cần duyệt cây đến độ cao h, do đó tổ hợp trở thành O(h), trong đó h là chiều cao của cây.
Độ phức tạp của không gian. O(1)
Không gian không đổi trong phương pháp này vì chúng tôi chỉ sử dụng các biến tạm thời.
Thời gian chạy thử nghiệm
Trong trường hợp này, chúng tôi đang chèn các nút vào cây tìm kiếm nhị phân
*/14
Xóa một nút – Phương thức xóa ()
Có ba trường hợp xóa nút khỏi cây. Hãy thảo luận về tất cả các trường hợp bằng cách sử dụng các ví dụ được đưa ra dưới đây
trường hợp 1. Xóa nút lá
Để xóa nút lá chúng ta cần duyệt đến nút lá cần thiết rồi xóa nút đó và cập nhật nút gốc.
Ví dụ. Xóa một nút lá 65
trường hợp 2. Xóa một nút có một nút con
Xóa nút đã cho đó và thay bằng nút con của nó.
Ví dụ. Xóa nút 25, để xóa nút 25 ta phải cập nhật nút con của nó là nút 65
trường hợp 3. Xóa một nút có hai nút con
Trong trường hợp này, hãy tìm nút kế tiếp theo thứ tự của nút mà nó đang xóa. Sao chép nội dung của nút kế tiếp theo thứ tự vào nút. Xóa người kế nhiệm đơn đặt hàng. Đối với trường hợp này, chúng ta cũng có thể sử dụng tiền thân inorder.
Ví dụ. Xóa nút 20 khỏi cây đã cho
Độ phức tạp về thời gian.
Trường hợp xấu nhất. O(n)
Trong trường hợp này cây là cây lệch. Vì vậy, chúng ta cần đi qua từng nút.
Trường hợp tốt nhất và trung bình. O(h)
Nói chung, độ phức tạp của thời gian phụ thuộc vào chiều cao(h) của BST.
Độ phức tạp của không gian. O(n)
Trong đó n là số nút trong BST. Trong trường hợp xấu nhất, ngăn xếp cuộc gọi của nút gọi tổng số nút.
Thời gian chạy thử nghiệm
Trong trường hợp này, chúng tôi đang xóa các nút trong cây tìm kiếm nhị phân.
Lưu ý. Dữ liệu trong Cây tìm kiếm nhị phân là {12 15 18 20 25 65}
*/15
Tìm kiếm một nút – phương thức tìm kiếm ()
Tìm kiếm một nút trong cây tìm kiếm nhị phân thực hiện các bước sau
- So sánh dữ liệu nút hiện tại với khóa nếu
- Nếu khóa được tìm thấy, sau đó trả lại nút
- Nếu khóa nhỏ hơn dữ liệu nút, hãy di chuyển dòng điện sang nút bên trái và lặp lại bước 1
- Nếu phím lớn hơn thì di chuyển sang phải và lặp lại bước 1
- Nếu không tìm thấy nút thì trả về NULL
Ví dụ. Hãy tìm nút có dữ liệu 15 trong BST đã cho
Độ phức tạp về thời gian.
Trường hợp xấu nhất. O(n)
Trong trường hợp xấu nhất, chúng ta phải đi qua từng nút. Ở đây n là số nút trong cây tìm kiếm nhị phân.
Trường hợp tốt nhất và Trường hợp trung bình. O(h)
Trong trường hợp này, độ phức tạp phụ thuộc vào độ cao h của cây tìm kiếm nhị phân.
Độ phức tạp của không gian. O(1)
Không gian không đổi trong phương pháp này vì chúng tôi chỉ sử dụng các biến tạm thời.
Thời gian chạy thử nghiệm
Trong trường hợp này, chúng tôi đang tìm kiếm các nút trong cây tìm kiếm nhị phân.
Lưu ý. Dữ liệu trong Cây tìm kiếm nhị phân là {12 15 18 20 25 65}
*/16
Traversals của cây tìm kiếm nhị phân
Truyền đơn đặt hàng
Trong quá trình duyệt theo thứ tự, chúng ta phải duyệt theo thứ tự sau
- Di chuyển sang trái đến một nút nhất định
- in dữ liệu nút
- Di chuyển sang phải đến một nút nhất định
Ví dụ. Giao dịch theo thứ tự của cây được đưa ra dưới đây
đặt hàng. 12, 15, 18, 20, 25, 65
Độ phức tạp về thời gian. O(n)
Ở đây, n là số nút. Chúng ta phải đi qua từng nút trong BST.
Độ phức tạp của không gian. O(h)
Chiều cao của cây nhị phân tìm kiếm lệch là số nút.
Thời gian chạy thử nghiệm
Trong trường hợp này, chúng tôi thực hiện duyệt theo thứ tự của cây tìm kiếm nhị phân.
Lưu ý. Dữ liệu trong Cây tìm kiếm nhị phân là {12 15 18 20 25 65}
*/17
Truyền tải đặt hàng trước
Trong quá trình duyệt theo thứ tự trước, chúng ta phải duyệt theo thứ tự sau
- In dữ liệu nút
- Di chuyển sang trái đến một nút nhất định
- Di chuyển sang phải đến một nút nhất định
Ví dụ. Trình duyệt đặt hàng trước của cây tìm kiếm nhị phân được đưa ra dưới đây
Đặt hàng trước. 20, 15, 12, 18, 25, 65
Độ phức tạp về thời gian. O(n)
Ở đây, n là số nút. Chúng ta phải đi qua từng nút trong BST.
Độ phức tạp của không gian. O(h)
Chiều cao của cây nhị phân tìm kiếm lệch là số nút.
Thời gian chạy thử nghiệm
Trong trường hợp này, chúng tôi thực hiện duyệt theo thứ tự trước của cây tìm kiếm nhị phân.
Lưu ý. Dữ liệu trong Cây tìm kiếm nhị phân là {12 15 18 20 25 65}
*/18
Truyền tải sau khi đặt hàng
Trong quá trình duyệt theo thứ tự trước, chúng ta phải duyệt theo thứ tự sau
- Di chuyển sang trái đến một nút nhất định
- Di chuyển sang phải đến một nút nhất định
- In dữ liệu của nút
Ví dụ. Trình duyệt theo thứ tự của cây tìm kiếm nhị phân được đưa ra dưới đây
đặt hàng sau. 12, 18, 15, 65, 25, 20
Độ phức tạp về thời gian. O(n)
Ở đây, n là số nút. Chúng ta phải đi qua từng nút trong BST.
Độ phức tạp của không gian. O(h)
Chiều cao của cây nhị phân tìm kiếm lệch là số nút.
Thời gian chạy thử nghiệm
Trong trường hợp này, chúng tôi thực hiện duyệt theo thứ tự sau của cây tìm kiếm nhị phân.
Lưu ý. Dữ liệu trong Cây tìm kiếm nhị phân là {12 15 18 20 25 65}
*/19
Để thực hành các chương trình về mọi chủ đề trong C, vui lòng truy cập “Ví dụ lập trình trong C”, “Cấu trúc dữ liệu trong C” và “Thuật toán trong C”