Skip to content

Commit 89e1175

Browse files
committed
main file of AVLtree
1 parent 69e8b1d commit 89e1175

1 file changed

Lines changed: 183 additions & 0 deletions

File tree

Algorithm/AVLtree.cpp

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
#include"AVLtree.h"
2+
AVL::treenode* AVL::find(int val)
3+
{
4+
if (nodecount == 0) return nullptr;
5+
treenode* temp = root;
6+
while (temp->value != val)
7+
{
8+
while (temp != nullptr && temp->value > val) temp = temp->left;
9+
while (temp != nullptr && temp->value < val) temp = temp->right;
10+
if (temp == nullptr) return nullptr;
11+
}
12+
return temp;
13+
}
14+
15+
void AVL::clearall(treenode* node)
16+
{
17+
if (node == nullptr) return;
18+
clearall(node->left);
19+
clearall(node->right);
20+
delete node;
21+
}
22+
23+
void AVL::print(treenode* node)
24+
{
25+
if (node == nullptr) return;
26+
print(node->left);
27+
std::cout << node->value << " ";
28+
print(node->right);
29+
}
30+
31+
32+
/* LL(insert into leftchild's leftsubtree of k1):
33+
sigle rotate
34+
35+
k1 k2
36+
/ \ / \
37+
k2 A B K1
38+
/ \ ==> / / \
39+
B C D C A
40+
/
41+
D
42+
*/
43+
AVL::treenode* AVL::LLrotate(treenode* k1)
44+
{
45+
treenode* k2 = k1->left;
46+
k1->left = k2->right;
47+
k2->right = k1;
48+
k1->height = max(getheight(k1->left), getheight(k1->right)) + 1;
49+
k2->height = max(getheight(k2->left), getheight(k2->right)) + 1;
50+
return k2;
51+
}
52+
53+
/* RR(insert into rightchild's rightsubtree of k1):
54+
sigle rotate
55+
56+
k1 k2
57+
/ \ / \
58+
A k2 k1 C
59+
/ \ ==> / \ \
60+
B C A B D
61+
\
62+
D
63+
*/
64+
AVL::treenode* AVL::RRrotate(treenode* k1)
65+
{
66+
treenode* k2 = k1->right;
67+
k1->right = k2->left;
68+
k2->left = k1;
69+
k1->height = max(getheight(k1->left), getheight(k1->right)) + 1;
70+
k2->height = max(getheight(k2->left), getheight(k2->right)) + 1;
71+
return k2;
72+
}
73+
74+
/* LR(insert into leftchild's rightsubtree of k1):
75+
double rotate
76+
77+
k1 k1 k3
78+
/ \ / \ / \
79+
k2 A k3 A k2 k1
80+
/ \ ==> / ==> / \ \
81+
B k3 k2 B C A
82+
/ / \
83+
C B C
84+
*/
85+
AVL::treenode* AVL::LRrotate(treenode* k1)
86+
{
87+
k1->left = RRrotate(k1->left);
88+
return LLrotate(k1);
89+
}
90+
91+
/* RL(insert into rightchild's leftsubtree of k1):
92+
double rotate
93+
94+
k1 k1 k3
95+
/ \ / \ / \
96+
A k2 A k3 k1 k2
97+
/ \ ==> / \ ==> / / \
98+
k3 B C k2 A C B
99+
/ \
100+
C B
101+
*/
102+
AVL::treenode* AVL::RLrotate(treenode* k1)
103+
{
104+
k1->right = LLrotate(k1->right);
105+
return RRrotate(k1);
106+
}
107+
108+
AVL::treenode* AVL::inserthelp(treenode*& node, int val)
109+
{
110+
if (nodecount == 0) {
111+
root->value = val;
112+
return root;
113+
}
114+
if (node == nullptr)
115+
return (node = new treenode(val, 0));
116+
else if (node->value > val)
117+
node->left = inserthelp(node->left, val);
118+
else
119+
node->right = inserthelp(node->right, val);
120+
node->height = max(getheight(node->left), getheight(node->right)) + 1;
121+
if (getheight(node->left) - getheight(node->right) == 2)
122+
{
123+
if (val < node->left->value)
124+
node = LLrotate(node);
125+
else
126+
node = LRrotate(node);
127+
}
128+
else if (getheight(node->right) - getheight(node->left) == 2)
129+
{
130+
if (val < node->right->value)
131+
node = RLrotate(node);
132+
else
133+
node = RRrotate(node);
134+
}
135+
return node;
136+
}
137+
138+
AVL::treenode* AVL::removehelp(treenode*& node, int val)
139+
{
140+
if (node == nullptr)
141+
{
142+
std::cout << "can't find " << val << std::endl;
143+
return nullptr;
144+
}
145+
if (node->value == val)
146+
{
147+
if (node->right == nullptr)
148+
{
149+
treenode* temp = node;
150+
node = node->left;
151+
delete temp;
152+
return root;
153+
}
154+
else
155+
{
156+
treenode* temp = node->right;
157+
while (temp->left)
158+
temp = temp->left;
159+
node->value = temp->value;
160+
node->right = removehelp(node->right, temp->value);
161+
}
162+
}
163+
else if (node->value > val)
164+
return removehelp(node->left, val);
165+
else
166+
return removehelp(node->right, val);
167+
node->height = max(getheight(node->left), getheight(node->right)) + 1;
168+
if (getheight(node->left) - getheight(node->right) == 2)
169+
{
170+
if (val < node->left->value)
171+
node = LLrotate(node);
172+
else
173+
node = LRrotate(node);
174+
}
175+
else if (getheight(node->right) - getheight(node->left) == 2)
176+
{
177+
if (val < node->right->value)
178+
node = RLrotate(node);
179+
else
180+
node = RRrotate(node);
181+
}
182+
return node;
183+
}

0 commit comments

Comments
 (0)