1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Lecture 13 binary search trees unsaved tài liệu Kỹ thuật Lập trình

13 302 0

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

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 13
Dung lượng 334,87 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Các thao tác trên cây nhị phân tìm kiếm.. Khái niệm về cây NPTK 3/4Một số tính chất của cây NPTK:  Cây nhị phân tìm kiếm là tập con của cây nhị phân, nên nó cũng có các cách duyệt LNR

Trang 1

Bài 13: Cây nhị phân tìm kiếm

Nội dung:

13.1 Khái niệm cây nhị phân tìm kiếm.

13.2 Các thao tác trên cây nhị phân tìm kiếm.

13.3 Một vài ví dụ sử dụng cây nhị phân tìm kiếm.

1 Deshpande Kakde: C and Data structures.chm, Chapter 20: Linked Lists

2 Elliz Horowitz – Fundamentals of Data Structures.chm, Chapter 4: Linked Lists

3 Kyle Loudon: Mastering Algorithms with C.chm, Chapter 5 Linked Lists.

4 Bài giảng TS Nguyễn Nam Hồng

Trang 2

13.1 Khái niệm về cây nhị phân tìm kiếm (1/4)

Khái niệm:

chứa các khóa

root, khóa của các node trên cây con bên phải lớn hơn khóa của root

Trang 3

13.1 Khái niệm về cây NPTK (2/4)

Ví dụ về cây nhị phân tìm kiếm

50 30

35

60

70

65

Trang 4

13.1 Khái niệm về cây NPTK (3/4)

Một số tính chất của cây NPTK:

 Cây nhị phân tìm kiếm là tập con của cây nhị phân, nên nó

cũng có các cách duyệt LNR, LRN, NLR

 Với cây nhị phân tìm kiếm, nếu duyệt cây theo kiểu inorder ta

sẽ được một dãy đã sắp theo chiều tăng dần.

kiếm trên cây nhị phân tìm kiếm nhanh hơn tìm kiếm tuần tự Tuy nhiên, việc biểu diễn cây dạng mảng sẽ gây khó khăn cho việc thêm, bớt

 Với việc biểu diễn dạng liên kết, ta có độ phức tạp của việc tìm kiếm là O( logn).

Trang 5

13.1 Khái niệm về cây NPTK (4/4)

Cấu trúc cây nhị phân tìm kiếm:

template < class TreeEntry>

struct tbnode {

TreeEntry data;

struct tbnode *lchild, *rchild;

};

Trang 6

13.2 Các thao tác trên cây NPTK (1/)

Một số thao tác trên cây nhị phân tìm kiếm:

1 Khởi tạo cây NPTK.

2 TBInsert : Thêm một node vào cây NPTK.

3 TBCount : đếm số node trên cây NPTK.

4 TBRInorder : duyệt cây dạng inorder.

5 TBRPostorder : duyệt cây dạng postorder.

6 TBRPreorder : duyệt cây dạng preorder.

7 TBLevelorder : duyệt cây dạng levelorder.

8 TBDelete : xóa node trên cây NPTK.

9 TBGetptr : định vị một node và node cha của nó.

Trang 7

13.2 Các thao tác trên cây NPTK (2/)

Khai báo lớp cây nhị phân tìm kiếm:

template <class TreeEntry> class TBTree {

public:

TBTree();

int TBInsert(TreeEntry value);

int TBCount();

void TBRInorder(tbnode<TreeEntry>* treenode, QueueClassC<TreeEntry> *q);

void TBRPostorder(tbnode<TreeEntry>* treenode, QueueClassC<TreeEntry> *q);

void TBRPreorder(tbnode<TreeEntry>* treenode, QueueClassC<TreeEntry> *q);

void TBInorder(QueueClassC<TreeEntry>* q);

void TBPostorder(QueueClassC<TreeEntry>* q);

void TBPreorder(QueueClassC<TreeEntry>* q);

void TBLevelorder(QueueClassC<TreeEntry>* q);

void TBGetptr(tbnode<TreeEntry> **father, tbnode<TreeEntry> **curr, TreeEntry value);

int TBDelete(TreeEntry value);

template<typename TreeEntry> friend void TreePrint(TBTree<TreeEntry> tree, int type);

private: tbnode<TreeEntry> * root; };

Trang 8

13.2 Các thao tác trên cây NPTK (3/)

Khởi tạo cây NPTK:

template < class TreeEntry>

TBTree<TreeEntry>::TBTree()

{

root=NULL;

}

root NULL

Trang 9

13.2 Các thao tác trên cây NPTK (4/)

Thêm một node vào cây NPTK:

 Nếu cây rỗng, cấp phát ô nhớ cho con

trỏ root

 Nếu cây không rỗng:

 Sử dụng 2 con trỏ temptemp1 để

xác định vị trí cần thêm (con trỏ temp1

sẽ trỏ vào NULL , con trỏ temp sẽ trỏ

vào node là cha của node mới ).

 Tùy thuộc vào giá trị mới được thêm

vào sẽ cấp phát ô nhớ cho temp->left

hay temp->right

root

50

NULL NULL

1

2

50 30

35

60

70 65

Thêm node

có giá trị

45 vào cây

te mp

te mp

45

NULL

Trang 10

13.2 Các thao tác trên cây NPTK (5/)

template <class TreeEntry>

int

TBTree<TreeEntry>::TBInsert(TreeEntr

y value)

{ int kt=0;

tbnode<TreeEntry> * temp, *temp1;

if(root==NULL) {

root = (tbnode<TreeEntry> *)

malloc(sizeof(tbnode<TreeEntry>));

if (root==NULL) {

printf("Khong du bo nho");

return kt; }

kt=1;

root->data=value;

root->lchild=root->rchild=NULL;

}

else

{ temp1=root;

Thêm một node vào cây NPTK temp1=temp1->lchild; else

temp1=temp1->rchild; } if(temp->data>value) { temp->lchild = (tbnode<TreeEntry> *)

malloc(sizeof(tbnode<TreeEntry>));

if(temp->lchild==NULL) {

printf("Khong du bo nho");

return kt; } kt=1;

temp=temp->lchild;

temp->data=value;

temp->lchild=temp->rchild=NULL;

} else { temp->rchild = (tbnode<TreeEntry> *)

malloc(sizeof(tbnode<TreeEntry>));

if(temp->rchild==NULL) { printf("Khong du bo nho");

return kt; } kt=1;

temp=temp->rchild;

temp->data=value;

temp->lchild=temp->rchild=NULL; } }

Trang 11

13.2 Các thao tác trên cây NPTK (6/)

Xóa một node trên cây NPTK:

Xóa node không có con

Trang 12

13.2 Các thao tác trên cây NPTK (7/)

Xóa một node trên cây NPTK:

Trang 13

13.2 Các thao tác trên cây NPTK (8/)

Xóa một node trên cây NPTK:

Xóa node có 2 con

Ngày đăng: 28/08/2014, 21:58

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm