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)

10 9 0
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)

Đang tải... (xem toàn văn)

Thông tin tài liệu

− Tất cả các giá trị trên cây con trái của X nhỏ hơn X − Tất cả các giá trị trên cây con phải của X lớn hơn X.. Đây có phải là cây nhị phân tìm kiếm?.[r]

(1)

Cây nhị phân tìm kiếm (Binary Search Trees)

Nguyễn Mạnh Hiển

(2)

Định nghĩa

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

• Cây nhị phân tìm kiếm nhị phân, với mọi nút X:

(3)(4)

Các thao tác

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

• Chèn phần tử x • Xóa phần tử x

(5)

Cài đặt

template <typename T> // T 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

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 nút BinaryNode * root; // trỏ tới nút gốc hàm trợ giúp

(6)

Kiểu nút

struct BinaryNode { T elem;

BinaryNode * left; BinaryNode * right;

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

left = l; right = r; }

(7)

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

BinarySearchTree() { root = NULL;

}

~BinarySearchTree() { makeEmpty();

}

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

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

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

(8)

Xóa rỗng có gốc t

// Hàm private trợ giúp xóa rỗng void makeEmpty(BinaryNode * & t) { if (t == NULL)

return; // rỗng makeEmpty(t->left); // xóa trái

makeEmpty(t->right); // xóa phải delete t; // xóa nút gốc

(9)

Tìm phần tử nhỏ

// 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) // rỗng? return NULL;

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

(10)

Tìm phần tử lớn

// 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; // tiếp sang bên phải return t;

Ngày đăng: 11/03/2021, 07:27

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan