Tải bản đầy đủ (.pdf) (10 trang)

Bài giảng Cấu trúc dữ liệu và giải thuật: Cây nhị phân tìm kiếm - Phan Mạnh Hiển (2020)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (644.13 KB, 10 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>Cây nhị phân tìm kiếm </b>


<b>(Binary Search Trees)</b>



Nguyễn Mạnh Hiển



</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

<b>Định nghĩa </b>



• Xét trường hợp các phần tử có giá trị khác nhau



• Cây nhị phân tìm kiếm là cây nhị phân, trong đó với


mọi nút X:



</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3></div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

<b>Các thao tác chính </b>



• Tìm phần tử nhỏ nhất


• Tìm phần tử lớn nhất


• Tìm phần tử x



• Chèn phần tử x


• Xóa phần tử x



</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

<b>Cài đặt </b>



template <typename T> // T là kiểu phần tử
class BinarySearchTree {


public:


hàm tạo, hàm hủy
kiểm tra rỗng
xóa rỗng cây



tìm min, tìm max, tìm phần tử x
chèn/xóa phần tử x


private:


struct BinaryNode { ... }; // kiểu của các nút
BinaryNode * root; // con trỏ tới nút gốc
các hàm trợ giúp


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>

<b>Kiểu của các nút </b>



struct BinaryNode {
T elem;


BinaryNode * left;
BinaryNode * right;


BinaryNode(T x, BinaryNode * l, BinaryNode * r) {
elem = x;


left = l;
right = r;
}


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

<b>Hàm tạo, hàm hủy, xóa rỗng </b>



BinarySearchTree() {
root = NULL;



}


~BinarySearchTree() {
makeEmpty();


}


void makeEmpty() { // hàm xóa rỗng cây


makeEmpty(root); // gọi hàm private trợ giúp
}


bool isEmpty() { // hàm kiểm tra rỗng
return (root == NULL);


</div>
<span class='text_page_counter'>(8)</span><div class='page_container' data-page=8>

<b>Xóa rỗng cây có gốc t </b>



// Hàm private trợ giúp xóa rỗng cây


void makeEmpty(BinaryNode * & t) {


if (t == NULL)



return; // thoát ra nếu cây rỗng


makeEmpty(t->left); // xóa cây con trái



makeEmpty(t->right); // xóa cây con phải


delete t; // xóa nút gốc



</div>
<span class='text_page_counter'>(9)</span><div class='page_container' data-page=9>

<b>Tìm phần tử nhỏ nhất </b>



// Hàm public


T findMin() {


BinaryNode * v = findMin(root); // gọi hàm private
return v->elem;


}


// Hàm private trợ giúp (dùng đệ quy)
BinaryNode * findMin(BinaryNode * t) {
if (t == NULL) // cây rỗng?
return NULL;


if(t->left == NULL) // nút ngoài cùng bên trái?
return t;


</div>
<span class='text_page_counter'>(10)</span><div class='page_container' data-page=10>

<b>Tìm phần tử lớn nhất </b>



// Hàm public
T findMax() {


BinaryNode * v = findMax(root); // gọi hàm private
return v->elem;


}


// Hàm private trợ giúp (không dùng đệ quy)
BinaryNode * findMax(BinaryNode * t) {


if (t != NULL)



while (t->right != NULL) // chưa đến tận cùng?
t = t->right; // đi tiếp sang bên phải
return t;


</div>

<!--links-->

×