@@ -7,40 +7,42 @@ class Node:
7
7
8
8
def __init__ (self , label ):
9
9
self .label = label
10
- self .left = None
11
- self .rigt = None
12
- self .parent = None
10
+ self ._parent = None
11
+ self ._left = None
12
+ self ._right = None
13
13
self .height = 0
14
14
15
- def getLabel (self ):
16
- return self .label
17
-
18
- def setLabel (self , label ):
19
- self .label = label
20
-
21
- def getLeft (self ):
22
- return self .left
23
-
24
- def setLeft (self , left ):
25
- self .left = left
26
-
27
- def getRight (self ):
28
- return self .rigt
29
-
30
- def setRight (self , right ):
31
- self .rigt = right
32
-
33
- def getParent (self ):
34
- return self .parent
35
-
36
- def setParent (self , parent ):
37
- self .parent = parent
38
-
39
- def setHeight (self , height ):
40
- self .height = height
41
-
42
- def getHeight (self , height ):
43
- return self .height
15
+ @property
16
+ def right (self ):
17
+ return self ._right
18
+
19
+ @right .setter
20
+ def right (self , node ):
21
+ if node is not None :
22
+ node ._parent = self
23
+ self ._right = node
24
+
25
+ @property
26
+ def left (self ):
27
+ return self ._left
28
+
29
+ @left .setter
30
+ def left (self , node ):
31
+ if node is not None :
32
+ node ._parent = self
33
+ self ._left = node
34
+
35
+ @property
36
+ def parent (self ):
37
+ return self ._parent
38
+
39
+ @parent .setter
40
+ def parent (self , node ):
41
+ if node is not None :
42
+ self ._parent = node
43
+ self .height = self .parent .height + 1
44
+ else :
45
+ self .height = 0
44
46
45
47
46
48
class AVL :
@@ -51,8 +53,10 @@ def __init__(self):
51
53
52
54
def insert (self , value ):
53
55
node = Node (value )
56
+
54
57
if self .root is None :
55
58
self .root = node
59
+ self .root .height = 0
56
60
self .size = 1
57
61
else :
58
62
# Same as Binary Tree
@@ -64,63 +68,77 @@ def insert(self, value):
64
68
65
69
dad_node = curr_node
66
70
67
- if node .getLabel () < curr_node .getLabel () :
68
- curr_node = curr_node .getLeft ()
71
+ if node .label < curr_node .label :
72
+ curr_node = curr_node .left
69
73
else :
70
- curr_node = curr_node .getRight ()
74
+ curr_node = curr_node .right
71
75
else :
72
- if node .getLabel () < dad_node .getLabel ():
73
- dad_node .setLeft (node )
74
- dad_node .setHeight (dad_node .getHeight () + 1 )
75
-
76
- if (dad_node .getRight ().getHeight () -
77
- dad_node .getLeft .getHeight () > 1 ):
78
- self .rebalance (dad_node )
79
-
76
+ node .height = dad_node .height
77
+ dad_node .height += 1
78
+ if node .label < dad_node .label :
79
+ dad_node .left = node
80
80
else :
81
- dad_node .setRight (node )
82
- dad_node .setHeight (dad_node .getHeight () + 1 )
83
-
84
- if (dad_node .getRight ().getHeight () -
85
- dad_node .getLeft .getHeight () > 1 ):
86
- self .rebalance (dad_node )
81
+ dad_node .right = node
82
+ self .rebalance (node )
83
+ self .size += 1
87
84
break
88
85
89
86
def rebalance (self , node ):
90
- if (node .getRight ().getHeight () -
91
- node .getLeft .getHeight () > 1 ):
92
- if (node .getRight ().getHeight () >
93
- node .getLeft .getHeight ()):
94
- pass
95
- else :
96
- pass
97
- pass
98
- elif (node .getRight ().getHeight () -
99
- node .getLeft .getHeight () > 2 ):
100
- if (node .getRight ().getHeight () >
101
- node .getLeft .getHeight ()):
102
- pass
103
- else :
104
- pass
105
- pass
106
- pass
87
+ n = node
88
+
89
+ while n is not None :
90
+ height_right = n .height
91
+ height_left = n .height
92
+
93
+ if n .right is not None :
94
+ height_right = n .right .height
95
+
96
+ if n .left is not None :
97
+ height_left = n .left .height
98
+
99
+ if abs (height_left - height_right ) > 1 :
100
+ if height_left > height_right :
101
+ left_child = n .left
102
+ if left_child is not None :
103
+ h_right = (right_child .right .height
104
+ if (right_child .right is not None ) else 0 )
105
+ h_left = (right_child .left .height
106
+ if (right_child .left is not None ) else 0 )
107
+ if (h_left > h_right ):
108
+ self .rotate_left (n )
109
+ break
110
+ else :
111
+ self .double_rotate_right (n )
112
+ break
113
+ else :
114
+ right_child = n .right
115
+ if right_child is not None :
116
+ h_right = (right_child .right .height
117
+ if (right_child .right is not None ) else 0 )
118
+ h_left = (right_child .left .height
119
+ if (right_child .left is not None ) else 0 )
120
+ if (h_left > h_right ):
121
+ self .double_rotate_left (n )
122
+ break
123
+ else :
124
+ self .rotate_right (n )
125
+ break
126
+ n = n .parent
107
127
108
128
def rotate_left (self , node ):
109
- # TODO: is this pythonic enought?
110
- aux = node .getLabel ()
111
- node = aux .getRight ()
112
- node .setHeight (node .getHeight () - 1 )
113
- node .setLeft (Node (aux ))
114
- node .getLeft ().setHeight (node .getHeight () + 1 )
115
- node .getRight ().setHeight (node .getRight ().getHeight () - 1 )
129
+ aux = node .parent .label
130
+ node .parent .label = node .label
131
+ node .parent .right = Node (aux )
132
+ node .parent .right .height = node .parent .height + 1
133
+ node .parent .left = node .right
134
+
116
135
117
136
def rotate_right (self , node ):
118
- aux = node .getLabel ()
119
- node = aux .getLeft ()
120
- node .setHeight (node .getHeight () - 1 )
121
- node .setRight (Node (aux ))
122
- node .getLeft ().setHeight (node .getHeight () + 1 )
123
- node .getLeft ().setHeight (node .getLeft ().getHeight () - 1 )
137
+ aux = node .parent .label
138
+ node .parent .label = node .label
139
+ node .parent .left = Node (aux )
140
+ node .parent .left .height = node .parent .height + 1
141
+ node .parent .right = node .right
124
142
125
143
def double_rotate_left (self , node ):
126
144
self .rotate_right (node .getRight ().getRight ())
@@ -129,3 +147,34 @@ def double_rotate_left(self, node):
129
147
def double_rotate_right (self , node ):
130
148
self .rotate_left (node .getLeft ().getLeft ())
131
149
self .rotate_right (node )
150
+
151
+ def empty (self ):
152
+ if self .root is None :
153
+ return True
154
+ return False
155
+
156
+ def preShow (self , curr_node ):
157
+ if curr_node is not None :
158
+ self .preShow (curr_node .left )
159
+ print (curr_node .label , end = " " )
160
+ self .preShow (curr_node .right )
161
+
162
+ def preorder (self , curr_node ):
163
+ if curr_node is not None :
164
+ self .preShow (curr_node .left )
165
+ self .preShow (curr_node .right )
166
+ print (curr_node .label , end = " " )
167
+
168
+ def getRoot (self ):
169
+ return self .root
170
+
171
+ t = AVL ()
172
+ t .insert (1 )
173
+ t .insert (2 )
174
+ t .insert (3 )
175
+ # t.preShow(t.root)
176
+ # print("\n")
177
+ # t.insert(4)
178
+ # t.insert(5)
179
+ # t.preShow(t.root)
180
+ # t.preorden(t.root)
0 commit comments