Tải bản đầy đủ (.pptx) (13 trang)

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

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 (399.94 KB, 13 trang )

PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 1 / 14
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.
Tham khảo:
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
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 2 / 14
13.1. Khái niệm về cây nhị phân tìm kiếm (1/4)
Khái niệm:

Cây nhị phân tìm kiếm là cây rỗng hoặc cây mà node có
chứa các khóa.

Các khóa của node trên cây con bên trái nhỏ hơn khóa củ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.

Cây con bên trái và phải cũng là cây nhị phân tìm kiếm.

Việc quản lý cây nhị phân thông qua node root.
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 3 / 14
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
25


40
35
60
70
65
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 4 / 14
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.

Cây nhị phân tìm kiếm là cấu trúc tìm kiếm hiệu quả. Việc tìm
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).
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 5 / 14
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;

};
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 6 / 14
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ó.
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 7 / 14
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; };
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 8 / 14
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
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 9 / 14
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ỏ temp và temp1 để
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
25
40
35
60
70
65
Thêm node
có giá trị
45 vào cây
tem
p
45
NULL
NULL NULL
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 10 / 14
13.2. Các thao tác trên cây NPTK (5/)
template <class TreeEntry>
int TBTree<TreeEntry>::TBInsert(TreeEntry
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;
while(temp1!=NULL) {
temp=temp1;
if(temp1->data>value)
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; }
}
return kt;
}
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 11 / 14
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
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 12 / 14
13.2. Các thao tác trên cây NPTK (7/)
Xóa một node trên cây NPTK:
Xóa node có 1 con
PhD Tống Minh Đức – Mob: 0984-485-888 – Email: 13 / 14
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

×