SlideShare a Scribd company logo
1 of 13
Bài tập AVL
Áp dụng – Nâng cao:
1. Sinh viên tự cài đặt thêm chức năng cho phép người dùng nhập vào khóa x và kiểm tra xem khóa x
có nằm trong cây AVL hay không.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Node* Tree_CB::search_x(Node* p, int data)
{
if(p == NULL)
return NULL;
else
{
if(p->Getkey() > data)
{
search_x(p->Getleft(), data);
}
else if(p->Getkey() < data)
{
search_x(p->Getright(), data);
}
else
return p;
}
}
2. Tạo cây AVL từ dãy A:
1 3 5 7 9 12 15 17 21 23 25 27
. Cho biết số phép so sánh cần thực hiện để tìm phần tử 21 trên cây AVL vừa tạo.
Số phép so sánh cần thực hiện để tìm phần tử thứ 21 là 3
2. Cài đặt chương trình đọc các số nguyên từ tập tin input.txt (không biết trước số lượng số nguyên
trên tập tin) và tạo cây AVL từ dữ liệu đọc được
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int b;
Tree_CB* tree_file = new Tree_CB();
ifstream input("input.txt");
if (!input) {
cout << "Khong mo duoc tap tin input.txt" << endl;
return 1;
}
while (input >> b) {
tree_file->InsertNode(new Node(b));
}
input.close();
cout << "Cay AVL nhap tu file" << endl;
tree_file->TravelNLR();
cout <<endl<< "Nhap So Can Xoa: "; cin >> b;
tree_file->deleteNode(tree_file->search_x(tree_file->Getroot(),
b));
cout << "Cay AVL sau khi xoa " << b <<" : " << endl;
tree_file->TravelNLR();
cout << endl;
input.close();
3. Cài đặt cây cân bằng AVL trong đó mỗi node trên cây lưu thông tin sinh viên.
Student.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
#include <string>
using namespace std;
class Student
{
private:
string Name;
string Student_ID;
string Class_Name;
int Age;
int bal;//thuoc tinh cho biet gia tri can bang
// 0, -1, 1: can bang, 2: lech trai, -2: lech phai
int height;
Student* parent;
Student* left;
Student* right;
public:
Student(string, string, string, int);
~Student();
Student *Getleft() { return left; }
void Setleft(Student *val) { left = val; }
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Student *Getright() { return right; }
void Setright(Student *val) { right = val; }
int Get_age() { return Age; }
string Get_name() { return Name; }
string Get_ID() { return Student_ID; }
string Get_clname() { return Class_Name; }
void Set_age(int val) { Age = val; }
void Set_name(string val) { Name = val; }
void Set_ID(string val) { Student_ID = val; }
void Set_Clname(string val) { Class_Name = val; }
Student* Getparent() { return parent; }
void Setparent(Student* val) { parent = val; }
protected:
};
#endif
Student.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "Student.h"
#include <iostream>
using namespace std;
Student::Student(string Name, string ID, string Class, int age)
{
this->Name = Name;
this->Student_ID = ID;
this->Class_Name = Class;
this->Age = age;
this->left = NULL;
this->right = NULL;
this->parent = NULL;
this->height = 0;
}
Student::~Student()
{
//dstor
}
List_student.h
1
2
3
4
5
6
7
8
9
10
11
12
#ifndef LIST_STUDENT_H
#define LIST_STUDENT_H
#include "Student.h"
class List_student
{
private:
Student* root;
int nNum;
int height;
public:
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
List_student();
~List_student();
Student* Getroot() { return root; }
void Setroot(Student* val) { root = val; }
bool Insert_student(Student*);
void delete_student(Student*);
void TravelLNR();
void LNR(Student*);
void LeftRotate(Student*&);
void RightRotate(Student*&);
int CheckBal(Student*);
int GetHeight(Student*);
Student* search_x(Student*, int);
protected:
};
#endif
List_student.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "List_student.h"
#include <iostream>
#include <string>
using namespace std;
List_student::List_student()
{
this->root = NULL;
//cstor
}
List_student::~List_student()
{
//dstor
}
void List_student::LeftRotate(Student*& P) {
Student* Q;
Student* T;
Q = P->Getright();
T = Q->Getleft();
P->Setright(Q->Getleft());
Q->Setleft(P);
P->Setparent(Q);
if(T != NULL)
T->Setparent(P);
P = Q;
}
void List_student::RightRotate(Student*& P)
{
Student* Q;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Student* T;
Q = P->Getleft();
T = Q->Getright();
P->Setleft(Q->Getright());
Q->Setright(P);
P->Setparent(Q);
if(T != NULL)
T->Setparent(P);
P = Q;
}
int List_student::CheckBal(Student* p)
{
int bal = this->GetHeight(p->Getleft()) - this->GetHeight(p-
>Getright());
return bal;
}
int List_student::GetHeight(Student* p)
{
if (p == NULL)
return 0;
else
return 1 + max(GetHeight(p->Getleft()), GetHeight(p-
>Getright()));
}
bool List_student::Insert_student(Student* n)
{
Student* p = this->root;
Student* T = NULL;
if (root == NULL)
{
this->root = n;
return true;
}
while (p != NULL) {
T = p;
if (p->Get_name() > n->Get_name())
p = p->Getleft();
else
if (p->Get_name() < n->Get_name())
p = p->Getright();
else
if (p->Get_name() == n->Get_name())
return false;
}
if (T->Get_name() > n->Get_name())
T->Setleft(n);
else T->Setright(n);
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
n->Setparent(T);
Student* x = n;
Student* parentX = x->Getparent();
while (x != NULL) {
int bal = this->CheckBal(x);
switch (bal) {
case 0: break; // Can bang
case 1: break; //
case -1: break; //
case 2:
if (x->Getleft()->Getleft() != NULL)// LEFT-LEFT
{
parentX = x->Getparent();
this->RightRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Get_name() > parentX->Get_name())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
else // Left-Right
{
//Left
parentX = x;
x = x->Getleft();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Get_name() > parentX->Get_name())
parentX->Setright(x);
else
parentX->Setleft(x);
}
//Right
x = x->Getparent();
parentX = x->Getparent();
this->RightRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Get_name() > parentX->Get_name())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
break;
case -2:
if (x->Getright()->Getright() != NULL)// RIGHT-RIGHT
{
parentX = x->Getparent();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX!=NULL)
{
if (x->Get_name() > parentX->Get_name())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
else // Right-Left
{
//Right
parentX = x;
x = x->Getright();
this->RightRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Get_name() > parentX->Get_name())
parentX->Setright(x);
else
parentX->Setleft(x);
}
//Left
x = x->Getparent();
parentX = x->Getparent();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Get_name() > parentX->Get_name())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
break;
}
if (x->Getparent() == NULL)
this->root = x;
x = x->Getparent();
}
return true;
}
189
190
191
192
193
194
195
196
197
198
199
200
201
202
void List_student::LNR(Student* r)
{
if( r != NULL)
{
LNR(r->Getleft());
cout << "Name: " <<r->Get_name() << endl;
cout << "Age: " <<r->Get_age() << endl;
cout << "ID: " <<r->Get_ID() << endl;
cout << "Class name: " <<r->Get_clname() << endl;
LNR(r->Getright());
}
}
void List_student::TravelLNR(){
LNR(this->root);
}
4. Tự tìm hiểu và cài đặt chức năng xóa một node ra khỏi cây AVL.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void Tree_CB::deleteNode(Node* n) {
Node* p = n;
//kiem tra
if (p == NULL) {
cout << "Khong Ton Tai!!" << endl;
}
//xoa node
if (n->Getleft() == NULL && n->Getright() == NULL)
{
if (p == this->root) {
this->root = NULL;
}
else {
if (n->Getparent()->Getleft() == p)
n->Getparent()->Setleft(NULL);
else
n->Getparent()->Setright(NULL);
}
delete n;
Node* x = n;
Node* parentX = x->Getparent();
while (x != NULL) {
int bal = this->CheckBal(x);
switch (bal) {
case 0: break; // Can bang
case 1: break; //
case -1: break; //
case 2:
if (x->Getleft()->Getleft() != NULL)//
LEFT-LEFT
{
parentX = x->Getparent();
this->RightRotate(x);
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
else // Left-Right
{
//Left
parentX = x;
x = x->Getleft();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
//Right
x = x->Getparent();
parentX = x->Getparent();
this->RightRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
break;
case -2:
if (x->Getright()->Getright() != NULL)// RIGHT-
RIGHT
{
parentX = x->Getparent();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX!=NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
}
else // Right-Left
{
//Right
parentX = x;
x = x->Getright();
this->RightRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
//Left
x = x->Getparent();
parentX = x->Getparent();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
break;
}
if (x->Getparent() == NULL)
this->root = x;
x = x->Getparent();
}
}
else {
if (p->Getright() != NULL) {
p = p->Getright();
while (p->Getleft() != NULL)
p = p->Getleft();
n->Setkey(p->Getkey());
deleteNode(p);
}
else {
p = p->Getleft();
while (p->Getright() != NULL)
p = p->Getright();
n->Setkey(p->Getkey());
deleteNode(p);
}
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
Node* x = n;
Node* parentX = x->Getparent();
while (x != NULL) {
int bal = this->CheckBal(x);
switch (bal) {
case 0: break; // Can bang
case 1: break; //
case -1: break; //
case 2:
if (x->Getleft()->Getleft() != NULL)//
LEFT-LEFT
{
parentX = x->Getparent();
this->RightRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
else // Left-Right
{
//Left
parentX = x;
x = x->Getleft();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
//Right
x = x->Getparent();
parentX = x->Getparent();
this->RightRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
break;
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
case -2:
if (x->Getright()->Getright())// RIGHT-RIGHT
{
parentX = x->Getparent();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX!=NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
else // Right-Left
{
//Right
parentX = x;
x = x->Getright();
this->RightRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
//Left
x = x->Getparent();
parentX = x->Getparent();
this->LeftRotate(x);
x->Setparent(parentX);
if(parentX != NULL)
{
if (x->Getkey() > parentX->Getkey())
parentX->Setright(x);
else
parentX->Setleft(x);
}
}
break;
}
if (x->Getparent() == NULL)
this->root = x;
x = x->Getparent();
}
}
}
Bài tập và bài tập nâng cao của cây  AVL.docx

More Related Content

Similar to Bài tập và bài tập nâng cao của cây AVL.docx

Using NetBeansImplement a queue named QueueLL using a Linked List .pdf
Using NetBeansImplement a queue named QueueLL using a Linked List .pdfUsing NetBeansImplement a queue named QueueLL using a Linked List .pdf
Using NetBeansImplement a queue named QueueLL using a Linked List .pdf
siennatimbok52331
 
関数潮流(Function Tendency)
関数潮流(Function Tendency)関数潮流(Function Tendency)
関数潮流(Function Tendency)
riue
 
Create a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfCreate a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdf
arihantmobileselepun
 
Note             Given Code modified as required and required met.pdf
Note             Given Code modified as required and required met.pdfNote             Given Code modified as required and required met.pdf
Note             Given Code modified as required and required met.pdf
Ankitchhabra28
 
Scala - fra newbie til ninja på en time
Scala - fra newbie til ninja på en timeScala - fra newbie til ninja på en time
Scala - fra newbie til ninja på en time
karianneberg
 
Implement a queue using a linkedlist (java)SolutionLinkedQueue.pdf
Implement a queue using a linkedlist (java)SolutionLinkedQueue.pdfImplement a queue using a linkedlist (java)SolutionLinkedQueue.pdf
Implement a queue using a linkedlist (java)SolutionLinkedQueue.pdf
kostikjaylonshaewe47
 
Modify HuffmanTree.java and HuffmanNode.java to allow the user to se.pdf
Modify HuffmanTree.java and HuffmanNode.java to allow the user to se.pdfModify HuffmanTree.java and HuffmanNode.java to allow the user to se.pdf
Modify HuffmanTree.java and HuffmanNode.java to allow the user to se.pdf
arjuncorner565
 
Given the following codepackage data1;import java.util.;p.pdf
Given the following codepackage data1;import java.util.;p.pdfGiven the following codepackage data1;import java.util.;p.pdf
Given the following codepackage data1;import java.util.;p.pdf
illyasraja7
 
JAVA OOP project; desperately need help asap im begging.Been stuck.pdf
JAVA OOP project; desperately need help asap im begging.Been stuck.pdfJAVA OOP project; desperately need help asap im begging.Been stuck.pdf
JAVA OOP project; desperately need help asap im begging.Been stuck.pdf
fantasiatheoutofthef
 
package singlylinkedlist; public class Node { public String valu.pdf
package singlylinkedlist; public class Node { public String valu.pdfpackage singlylinkedlist; public class Node { public String valu.pdf
package singlylinkedlist; public class Node { public String valu.pdf
amazing2001
 

Similar to Bài tập và bài tập nâng cao của cây AVL.docx (20)

Implement the additional 5 methods as indicated in the LinkedList fi.pdf
Implement the additional 5 methods as indicated in the LinkedList fi.pdfImplement the additional 5 methods as indicated in the LinkedList fi.pdf
Implement the additional 5 methods as indicated in the LinkedList fi.pdf
 
Unittesting JavaScript with Evidence
Unittesting JavaScript with EvidenceUnittesting JavaScript with Evidence
Unittesting JavaScript with Evidence
 
2 a networkflow
2 a networkflow2 a networkflow
2 a networkflow
 
Using NetBeansImplement a queue named QueueLL using a Linked List .pdf
Using NetBeansImplement a queue named QueueLL using a Linked List .pdfUsing NetBeansImplement a queue named QueueLL using a Linked List .pdf
Using NetBeansImplement a queue named QueueLL using a Linked List .pdf
 
SDC - Einführung in Scala
SDC - Einführung in ScalaSDC - Einführung in Scala
SDC - Einführung in Scala
 
Drupal7 dbtng
Drupal7  dbtngDrupal7  dbtng
Drupal7 dbtng
 
ECMAScript 5: Новое в JavaScript
ECMAScript 5: Новое в JavaScriptECMAScript 5: Новое в JavaScript
ECMAScript 5: Новое в JavaScript
 
関数潮流(Function Tendency)
関数潮流(Function Tendency)関数潮流(Function Tendency)
関数潮流(Function Tendency)
 
Create a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdfCreate a java project that - Draw a circle with three random init.pdf
Create a java project that - Draw a circle with three random init.pdf
 
Note             Given Code modified as required and required met.pdf
Note             Given Code modified as required and required met.pdfNote             Given Code modified as required and required met.pdf
Note             Given Code modified as required and required met.pdf
 
Scala - fra newbie til ninja på en time
Scala - fra newbie til ninja på en timeScala - fra newbie til ninja på en time
Scala - fra newbie til ninja på en time
 
Implement a queue using a linkedlist (java)SolutionLinkedQueue.pdf
Implement a queue using a linkedlist (java)SolutionLinkedQueue.pdfImplement a queue using a linkedlist (java)SolutionLinkedQueue.pdf
Implement a queue using a linkedlist (java)SolutionLinkedQueue.pdf
 
Scala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 WorldScala vs Java 8 in a Java 8 World
Scala vs Java 8 in a Java 8 World
 
Scala taxonomy
Scala taxonomyScala taxonomy
Scala taxonomy
 
Internal workshop es6_2015
Internal workshop es6_2015Internal workshop es6_2015
Internal workshop es6_2015
 
Modify HuffmanTree.java and HuffmanNode.java to allow the user to se.pdf
Modify HuffmanTree.java and HuffmanNode.java to allow the user to se.pdfModify HuffmanTree.java and HuffmanNode.java to allow the user to se.pdf
Modify HuffmanTree.java and HuffmanNode.java to allow the user to se.pdf
 
Given the following codepackage data1;import java.util.;p.pdf
Given the following codepackage data1;import java.util.;p.pdfGiven the following codepackage data1;import java.util.;p.pdf
Given the following codepackage data1;import java.util.;p.pdf
 
JAVA OOP project; desperately need help asap im begging.Been stuck.pdf
JAVA OOP project; desperately need help asap im begging.Been stuck.pdfJAVA OOP project; desperately need help asap im begging.Been stuck.pdf
JAVA OOP project; desperately need help asap im begging.Been stuck.pdf
 
package singlylinkedlist; public class Node { public String valu.pdf
package singlylinkedlist; public class Node { public String valu.pdfpackage singlylinkedlist; public class Node { public String valu.pdf
package singlylinkedlist; public class Node { public String valu.pdf
 
ECMAScript 6 and beyond
ECMAScript 6 and beyondECMAScript 6 and beyond
ECMAScript 6 and beyond
 

Recently uploaded

Top profile Call Girls In Rohtak [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Rohtak [ 7014168258 ] Call Me For Genuine Models We...Top profile Call Girls In Rohtak [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Rohtak [ 7014168258 ] Call Me For Genuine Models We...
nirzagarg
 
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
gajnagarg
 
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
gajnagarg
 
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
nirzagarg
 
Gartner's Data Analytics Maturity Model.pptx
Gartner's Data Analytics Maturity Model.pptxGartner's Data Analytics Maturity Model.pptx
Gartner's Data Analytics Maturity Model.pptx
chadhar227
 
Lake Town / Independent Kolkata Call Girls Phone No 8005736733 Elite Escort S...
Lake Town / Independent Kolkata Call Girls Phone No 8005736733 Elite Escort S...Lake Town / Independent Kolkata Call Girls Phone No 8005736733 Elite Escort S...
Lake Town / Independent Kolkata Call Girls Phone No 8005736733 Elite Escort S...
HyderabadDolls
 
Sonagachi * best call girls in Kolkata | ₹,9500 Pay Cash 8005736733 Free Home...
Sonagachi * best call girls in Kolkata | ₹,9500 Pay Cash 8005736733 Free Home...Sonagachi * best call girls in Kolkata | ₹,9500 Pay Cash 8005736733 Free Home...
Sonagachi * best call girls in Kolkata | ₹,9500 Pay Cash 8005736733 Free Home...
HyderabadDolls
 
Jual Obat Aborsi Surabaya ( Asli No.1 ) 085657271886 Obat Penggugur Kandungan...
Jual Obat Aborsi Surabaya ( Asli No.1 ) 085657271886 Obat Penggugur Kandungan...Jual Obat Aborsi Surabaya ( Asli No.1 ) 085657271886 Obat Penggugur Kandungan...
Jual Obat Aborsi Surabaya ( Asli No.1 ) 085657271886 Obat Penggugur Kandungan...
ZurliaSoop
 
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
nirzagarg
 
Abortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get CytotecAbortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Riyadh +966572737505 get cytotec
 

Recently uploaded (20)

Charbagh + Female Escorts Service in Lucknow | Starting ₹,5K To @25k with A/C...
Charbagh + Female Escorts Service in Lucknow | Starting ₹,5K To @25k with A/C...Charbagh + Female Escorts Service in Lucknow | Starting ₹,5K To @25k with A/C...
Charbagh + Female Escorts Service in Lucknow | Starting ₹,5K To @25k with A/C...
 
Ranking and Scoring Exercises for Research
Ranking and Scoring Exercises for ResearchRanking and Scoring Exercises for Research
Ranking and Scoring Exercises for Research
 
Top profile Call Girls In Rohtak [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Rohtak [ 7014168258 ] Call Me For Genuine Models We...Top profile Call Girls In Rohtak [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Rohtak [ 7014168258 ] Call Me For Genuine Models We...
 
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
Top profile Call Girls In Indore [ 7014168258 ] Call Me For Genuine Models We...
 
Dubai Call Girls Peeing O525547819 Call Girls Dubai
Dubai Call Girls Peeing O525547819 Call Girls DubaiDubai Call Girls Peeing O525547819 Call Girls Dubai
Dubai Call Girls Peeing O525547819 Call Girls Dubai
 
Predicting HDB Resale Prices - Conducting Linear Regression Analysis With Orange
Predicting HDB Resale Prices - Conducting Linear Regression Analysis With OrangePredicting HDB Resale Prices - Conducting Linear Regression Analysis With Orange
Predicting HDB Resale Prices - Conducting Linear Regression Analysis With Orange
 
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
Top profile Call Girls In bhavnagar [ 7014168258 ] Call Me For Genuine Models...
 
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
Top profile Call Girls In Bihar Sharif [ 7014168258 ] Call Me For Genuine Mod...
 
Gartner's Data Analytics Maturity Model.pptx
Gartner's Data Analytics Maturity Model.pptxGartner's Data Analytics Maturity Model.pptx
Gartner's Data Analytics Maturity Model.pptx
 
Lake Town / Independent Kolkata Call Girls Phone No 8005736733 Elite Escort S...
Lake Town / Independent Kolkata Call Girls Phone No 8005736733 Elite Escort S...Lake Town / Independent Kolkata Call Girls Phone No 8005736733 Elite Escort S...
Lake Town / Independent Kolkata Call Girls Phone No 8005736733 Elite Escort S...
 
Case Study 4 Where the cry of rebellion happen?
Case Study 4 Where the cry of rebellion happen?Case Study 4 Where the cry of rebellion happen?
Case Study 4 Where the cry of rebellion happen?
 
Giridih Escorts Service Girl ^ 9332606886, WhatsApp Anytime Giridih
Giridih Escorts Service Girl ^ 9332606886, WhatsApp Anytime GiridihGiridih Escorts Service Girl ^ 9332606886, WhatsApp Anytime Giridih
Giridih Escorts Service Girl ^ 9332606886, WhatsApp Anytime Giridih
 
Sonagachi * best call girls in Kolkata | ₹,9500 Pay Cash 8005736733 Free Home...
Sonagachi * best call girls in Kolkata | ₹,9500 Pay Cash 8005736733 Free Home...Sonagachi * best call girls in Kolkata | ₹,9500 Pay Cash 8005736733 Free Home...
Sonagachi * best call girls in Kolkata | ₹,9500 Pay Cash 8005736733 Free Home...
 
Digital Transformation Playbook by Graham Ware
Digital Transformation Playbook by Graham WareDigital Transformation Playbook by Graham Ware
Digital Transformation Playbook by Graham Ware
 
Statistics notes ,it includes mean to index numbers
Statistics notes ,it includes mean to index numbersStatistics notes ,it includes mean to index numbers
Statistics notes ,it includes mean to index numbers
 
Jual Obat Aborsi Surabaya ( Asli No.1 ) 085657271886 Obat Penggugur Kandungan...
Jual Obat Aborsi Surabaya ( Asli No.1 ) 085657271886 Obat Penggugur Kandungan...Jual Obat Aborsi Surabaya ( Asli No.1 ) 085657271886 Obat Penggugur Kandungan...
Jual Obat Aborsi Surabaya ( Asli No.1 ) 085657271886 Obat Penggugur Kandungan...
 
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
Top profile Call Girls In Satna [ 7014168258 ] Call Me For Genuine Models We ...
 
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptx
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptxRESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptx
RESEARCH-FINAL-DEFENSE-PPT-TEMPLATE.pptx
 
Abortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get CytotecAbortion pills in Jeddah | +966572737505 | Get Cytotec
Abortion pills in Jeddah | +966572737505 | Get Cytotec
 
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book now
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book nowVadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book now
Vadodara 💋 Call Girl 7737669865 Call Girls in Vadodara Escort service book now
 

Bài tập và bài tập nâng cao của cây AVL.docx

  • 1. Bài tập AVL Áp dụng – Nâng cao: 1. Sinh viên tự cài đặt thêm chức năng cho phép người dùng nhập vào khóa x và kiểm tra xem khóa x có nằm trong cây AVL hay không. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Node* Tree_CB::search_x(Node* p, int data) { if(p == NULL) return NULL; else { if(p->Getkey() > data) { search_x(p->Getleft(), data); } else if(p->Getkey() < data) { search_x(p->Getright(), data); } else return p; } } 2. Tạo cây AVL từ dãy A: 1 3 5 7 9 12 15 17 21 23 25 27 . Cho biết số phép so sánh cần thực hiện để tìm phần tử 21 trên cây AVL vừa tạo. Số phép so sánh cần thực hiện để tìm phần tử thứ 21 là 3
  • 2. 2. Cài đặt chương trình đọc các số nguyên từ tập tin input.txt (không biết trước số lượng số nguyên trên tập tin) và tạo cây AVL từ dữ liệu đọc được 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int b; Tree_CB* tree_file = new Tree_CB(); ifstream input("input.txt"); if (!input) { cout << "Khong mo duoc tap tin input.txt" << endl; return 1; } while (input >> b) { tree_file->InsertNode(new Node(b)); } input.close(); cout << "Cay AVL nhap tu file" << endl; tree_file->TravelNLR(); cout <<endl<< "Nhap So Can Xoa: "; cin >> b; tree_file->deleteNode(tree_file->search_x(tree_file->Getroot(), b)); cout << "Cay AVL sau khi xoa " << b <<" : " << endl; tree_file->TravelNLR(); cout << endl; input.close(); 3. Cài đặt cây cân bằng AVL trong đó mỗi node trên cây lưu thông tin sinh viên. Student.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #ifndef STUDENT_H #define STUDENT_H #include <iostream> #include <string> using namespace std; class Student { private: string Name; string Student_ID; string Class_Name; int Age; int bal;//thuoc tinh cho biet gia tri can bang // 0, -1, 1: can bang, 2: lech trai, -2: lech phai int height; Student* parent; Student* left; Student* right; public: Student(string, string, string, int); ~Student(); Student *Getleft() { return left; } void Setleft(Student *val) { left = val; }
  • 3. 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Student *Getright() { return right; } void Setright(Student *val) { right = val; } int Get_age() { return Age; } string Get_name() { return Name; } string Get_ID() { return Student_ID; } string Get_clname() { return Class_Name; } void Set_age(int val) { Age = val; } void Set_name(string val) { Name = val; } void Set_ID(string val) { Student_ID = val; } void Set_Clname(string val) { Class_Name = val; } Student* Getparent() { return parent; } void Setparent(Student* val) { parent = val; } protected: }; #endif Student.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #include "Student.h" #include <iostream> using namespace std; Student::Student(string Name, string ID, string Class, int age) { this->Name = Name; this->Student_ID = ID; this->Class_Name = Class; this->Age = age; this->left = NULL; this->right = NULL; this->parent = NULL; this->height = 0; } Student::~Student() { //dstor } List_student.h 1 2 3 4 5 6 7 8 9 10 11 12 #ifndef LIST_STUDENT_H #define LIST_STUDENT_H #include "Student.h" class List_student { private: Student* root; int nNum; int height; public:
  • 4. 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 List_student(); ~List_student(); Student* Getroot() { return root; } void Setroot(Student* val) { root = val; } bool Insert_student(Student*); void delete_student(Student*); void TravelLNR(); void LNR(Student*); void LeftRotate(Student*&); void RightRotate(Student*&); int CheckBal(Student*); int GetHeight(Student*); Student* search_x(Student*, int); protected: }; #endif List_student.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 #include "List_student.h" #include <iostream> #include <string> using namespace std; List_student::List_student() { this->root = NULL; //cstor } List_student::~List_student() { //dstor } void List_student::LeftRotate(Student*& P) { Student* Q; Student* T; Q = P->Getright(); T = Q->Getleft(); P->Setright(Q->Getleft()); Q->Setleft(P); P->Setparent(Q); if(T != NULL) T->Setparent(P); P = Q; } void List_student::RightRotate(Student*& P) { Student* Q;
  • 5. 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 Student* T; Q = P->Getleft(); T = Q->Getright(); P->Setleft(Q->Getright()); Q->Setright(P); P->Setparent(Q); if(T != NULL) T->Setparent(P); P = Q; } int List_student::CheckBal(Student* p) { int bal = this->GetHeight(p->Getleft()) - this->GetHeight(p- >Getright()); return bal; } int List_student::GetHeight(Student* p) { if (p == NULL) return 0; else return 1 + max(GetHeight(p->Getleft()), GetHeight(p- >Getright())); } bool List_student::Insert_student(Student* n) { Student* p = this->root; Student* T = NULL; if (root == NULL) { this->root = n; return true; } while (p != NULL) { T = p; if (p->Get_name() > n->Get_name()) p = p->Getleft(); else if (p->Get_name() < n->Get_name()) p = p->Getright(); else if (p->Get_name() == n->Get_name()) return false; } if (T->Get_name() > n->Get_name()) T->Setleft(n); else T->Setright(n);
  • 6. 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 n->Setparent(T); Student* x = n; Student* parentX = x->Getparent(); while (x != NULL) { int bal = this->CheckBal(x); switch (bal) { case 0: break; // Can bang case 1: break; // case -1: break; // case 2: if (x->Getleft()->Getleft() != NULL)// LEFT-LEFT { parentX = x->Getparent(); this->RightRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Get_name() > parentX->Get_name()) parentX->Setright(x); else parentX->Setleft(x); } } else // Left-Right { //Left parentX = x; x = x->Getleft(); this->LeftRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Get_name() > parentX->Get_name()) parentX->Setright(x); else parentX->Setleft(x); } //Right x = x->Getparent(); parentX = x->Getparent(); this->RightRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Get_name() > parentX->Get_name()) parentX->Setright(x); else parentX->Setleft(x); } }
  • 7. 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 break; case -2: if (x->Getright()->Getright() != NULL)// RIGHT-RIGHT { parentX = x->Getparent(); this->LeftRotate(x); x->Setparent(parentX); if(parentX!=NULL) { if (x->Get_name() > parentX->Get_name()) parentX->Setright(x); else parentX->Setleft(x); } } else // Right-Left { //Right parentX = x; x = x->Getright(); this->RightRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Get_name() > parentX->Get_name()) parentX->Setright(x); else parentX->Setleft(x); } //Left x = x->Getparent(); parentX = x->Getparent(); this->LeftRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Get_name() > parentX->Get_name()) parentX->Setright(x); else parentX->Setleft(x); } } break; } if (x->Getparent() == NULL) this->root = x; x = x->Getparent(); } return true; }
  • 8. 189 190 191 192 193 194 195 196 197 198 199 200 201 202 void List_student::LNR(Student* r) { if( r != NULL) { LNR(r->Getleft()); cout << "Name: " <<r->Get_name() << endl; cout << "Age: " <<r->Get_age() << endl; cout << "ID: " <<r->Get_ID() << endl; cout << "Class name: " <<r->Get_clname() << endl; LNR(r->Getright()); } } void List_student::TravelLNR(){ LNR(this->root); } 4. Tự tìm hiểu và cài đặt chức năng xóa một node ra khỏi cây AVL. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 void Tree_CB::deleteNode(Node* n) { Node* p = n; //kiem tra if (p == NULL) { cout << "Khong Ton Tai!!" << endl; } //xoa node if (n->Getleft() == NULL && n->Getright() == NULL) { if (p == this->root) { this->root = NULL; } else { if (n->Getparent()->Getleft() == p) n->Getparent()->Setleft(NULL); else n->Getparent()->Setright(NULL); } delete n; Node* x = n; Node* parentX = x->Getparent(); while (x != NULL) { int bal = this->CheckBal(x); switch (bal) { case 0: break; // Can bang case 1: break; // case -1: break; // case 2: if (x->Getleft()->Getleft() != NULL)// LEFT-LEFT { parentX = x->Getparent(); this->RightRotate(x);
  • 9. 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } } else // Left-Right { //Left parentX = x; x = x->Getleft(); this->LeftRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } //Right x = x->Getparent(); parentX = x->Getparent(); this->RightRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } } break; case -2: if (x->Getright()->Getright() != NULL)// RIGHT- RIGHT { parentX = x->Getparent(); this->LeftRotate(x); x->Setparent(parentX); if(parentX!=NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); }
  • 10. 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 } else // Right-Left { //Right parentX = x; x = x->Getright(); this->RightRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } //Left x = x->Getparent(); parentX = x->Getparent(); this->LeftRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } } break; } if (x->Getparent() == NULL) this->root = x; x = x->Getparent(); } } else { if (p->Getright() != NULL) { p = p->Getright(); while (p->Getleft() != NULL) p = p->Getleft(); n->Setkey(p->Getkey()); deleteNode(p); } else { p = p->Getleft(); while (p->Getright() != NULL) p = p->Getright(); n->Setkey(p->Getkey()); deleteNode(p); }
  • 11. 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 Node* x = n; Node* parentX = x->Getparent(); while (x != NULL) { int bal = this->CheckBal(x); switch (bal) { case 0: break; // Can bang case 1: break; // case -1: break; // case 2: if (x->Getleft()->Getleft() != NULL)// LEFT-LEFT { parentX = x->Getparent(); this->RightRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } } else // Left-Right { //Left parentX = x; x = x->Getleft(); this->LeftRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } //Right x = x->Getparent(); parentX = x->Getparent(); this->RightRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } } break;
  • 12. 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 case -2: if (x->Getright()->Getright())// RIGHT-RIGHT { parentX = x->Getparent(); this->LeftRotate(x); x->Setparent(parentX); if(parentX!=NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } } else // Right-Left { //Right parentX = x; x = x->Getright(); this->RightRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } //Left x = x->Getparent(); parentX = x->Getparent(); this->LeftRotate(x); x->Setparent(parentX); if(parentX != NULL) { if (x->Getkey() > parentX->Getkey()) parentX->Setright(x); else parentX->Setleft(x); } } break; } if (x->Getparent() == NULL) this->root = x; x = x->Getparent(); } } }