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ệnBST 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ảnSau đâ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útXá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ếmBấ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ánstruct 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ènBấ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;
};
0struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
1struct 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 */ 0struct 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 9struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
00struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
01struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
02struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
03struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
00struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
05struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
02 0 struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
09struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
10struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
11struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
00struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
13struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
02 0 struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
17struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
18struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
11struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
00struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
21struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
02 0 struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
25struct 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/* 25struct node {
int data;
struct node *leftChild;
struct node *rightChild;
};
2/* 27 /* 29*/ 8/* 31/* 32/* 19 /* 35/* 36/* 37 /* 39/* 22 /* 42/* 43struct 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/* 89struct 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 26struct 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 49struct 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 60struct 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 71struct 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 83struct 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 95struct 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*/ 07struct 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 */ 14Xó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} */ 15Tì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} */ 16Traversals 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} */ 17Truyề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} */ 18Truyề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”
Cây tìm kiếm nhị phân trong C là gì?
Cây tìm kiếm nhị phân là cây nhị phân trong đó đối với mọi nút, các giá trị trong cây con bên trái của nó nhỏ hơn giá trị của nút nhỏ hơn nhiều hơn mọi giá trị trong cây con bên trái của nó. . Thao tác tìm kiếm trong cây tìm kiếm nhị phân trở nên đơn giản hơn vì ở đây các phần tử được lưu trữ theo thứ tự đã sắp xếp. . Searching operation in a binary search tree becomes simpler because here elements are stored in sorted order.
Làm cách nào để triển khai cây tìm kiếm nhị phân trong C?
Để 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
Mã BST có bằng C không?
Trong hướng dẫn này, bạn sẽ tìm hiểu cách hoạt động của Cây tìm kiếm nhị phân. Ngoài ra, bạn sẽ tìm thấy các ví dụ hoạt động của Cây tìm kiếm nhị phân trong C, C++, Java và Python . Cây tìm kiếm nhị phân là một cấu trúc dữ liệu cho phép chúng tôi nhanh chóng duy trì một danh sách các số được sắp xếp.
Cách đọc cây nhị phân trong C?
|