http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Cây tìm kiếm nhị phân (Binary Search Tree) Cây tìm kiếm nhị phân ? Một tìm kiếm nhị phân (Binary Search Tree – viết tắt BST) mà tất nút có đặc điểm sau: • Cây bên trái nút có khóa (key) nhỏ giá trị khóa nút cha (của này) • Cây bên phải nút có khóa lớn giá trị khóa nút cha (của này) Vì nói rằng, tìm kiếm nhị phân (BST) phân chia tất thành hai phần: bên trái bên phải định nghĩa sau: left_subtree (keys) ≤ node (key) ≤ right_subtree (keys) Biểu diễn tìm kiếm nhị phân (BST) Cây tìm kiếm nhị phân (BST) tập hợp bao gồm nút xếp theo cách để chúng trì tuân theo đặc điểm tìm kiếm nhị phân Mỗi nút có khóa giá trị liên kết với Trong tìm kiếm, khóa cần tìm so sánh với khóa tìm kiếm nhị phân (BST) tìm thấy, giá trị liên kết thu nhận Ví dụ tìm kiếm nhị phân (BST): http://vietjack.com/ Trang chia sẻ các bài học online miễn phí http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com Từ hình ví dụ minh họa ta thấy rằng, khóa nút gốc có giá trị 27 tất khóa bên trái bên trái có giá trị nhỏ 27 tất khóa bên phải bên phải có giá trị lớn 27 Hoạt động tìm kiếm nhị phân Dưới số hoạt động thực tìm kiếm nhị phân: • Hoạt động tìm kiếm: tìm kiếm phần tử • Hoạt động chèn: chèn phần tử vào • Hoạt động duyệt tiền thứ tự: duyệt theo cách thức duyệt tiền thứ tự • Hoạt động duyệt trung thứ tự: duyệt theo cách thứ duyệt trung thứ tự • Hoạt động duyệt hậu thứ tự: duyệt theo cách thức duyệt hậu thứ tự Nút (Node) tìm kiếm nhị phân Một nút có vài liệu, tham chiếu tới nút bên trái nút bên phải struct node { *rightChild; }; int data; struct node *leftChild; struct node Hoạt động tìm kiếm tìm kiếm nhị phân Mỗi phần tử tìm kiếm: bắt đầu tìm kiếm từ nút gốc, sau liệu nhỏ giá trị khóa (key), tìm phần tử bên trái; lớn tìm phần tử bên phải Dưới giải thuật cho nút: struct node* search(int data){ struct node *current = root; printf("Truy cap cac phan tu: "); while(current->data != data){ if(current != NULL) { printf("%d ",current->data); current->rightChild; } //khơng tìm thấy if(current == NULL){ return NULL; } } Hoạt động chèn tìm kiếm nhị phân Mỗi phần tử chèn: cần xác định vị trí xác phần tử Bắt đầu tìm kiếm từ nút gốc, sau liệu nhỏ giá trị khóa (key), tìm kiếm vị trí trống bên trái chèn liệu vào đó; liệu nhỏ tìm kiếm vị trí sống bên phải chèn liệu vào http://vietjack.com/ Trang chia sẻ các bài học online miễn phí // } ret http://vietjack.com/cau-‐truc-‐du-‐lieu-‐va-‐giai-‐thuat/index.jsp Copyright © vietjack.com void insert(int data){ struct node *tempNode = (struct node*) malloc(sizeof(struct node)); struct node *current; struct node *parent; tempNode->data = data; tempNode->leftChild = NULL; tempNode->rightChild = NULL; //Nếu trống if(root == NULL){ root = tempNode; }else { current = root; parent = NULL; while(1){ parent = current; //tới bên trái if(data < parent->data){ current = current->leftChild; //chèn liệu vào bên trái if(current == NULL){ parent->leftChild = tempNode; return; } }//tới bên phải else{ current = current->rightChild; //chèn liệu vào bên phải if(current == NULL){ parent->rightChild = tempNode; return; } } } } } http://vietjack.com/ Trang chia sẻ các bài học online miễn phí ... thuật cho nút: struct node* search(int data){ struct node *current = root; printf("Truy cap cac phan tu: "); while(current->data != data){ if(current != NULL) { printf("%d ",current->data); current->rightChild;