@@ -53,7 +53,6 @@ def setheight(self,height):
53
53
return
54
54
55
55
def getheight (node ):
56
- # print("xxx")
57
56
if node is None :
58
57
return 0
59
58
return node .getheight ()
@@ -66,6 +65,17 @@ def my_max(a,b):
66
65
67
66
68
67
def leftrotation (node ):
68
+ '''
69
+ A B
70
+ / \ / \
71
+ B C Bl A
72
+ / \ --> / / \
73
+ Bl Br UB Br C
74
+ /
75
+ UB
76
+
77
+ UB = unbalanced node
78
+ '''
69
79
print ("left rotation node:" ,node .getdata ())
70
80
ret = node .getleft ()
71
81
node .setleft (ret .getright ())
@@ -77,6 +87,9 @@ def leftrotation(node):
77
87
return ret
78
88
79
89
def rightrotation (node ):
90
+ '''
91
+ a mirror symmetry rotation of the leftrotation
92
+ '''
80
93
print ("right rotation node:" ,node .getdata ())
81
94
ret = node .getright ()
82
95
node .setright (ret .getleft ())
@@ -87,24 +100,35 @@ def rightrotation(node):
87
100
ret .setheight (h2 )
88
101
return ret
89
102
103
+ def rlrotation (node ):
104
+ '''
105
+ A A Br
106
+ / \ / \ / \
107
+ B C RR Br C LR B A
108
+ / \ --> / \ --> / / \
109
+ Bl Br B UB Bl UB C
110
+ \ /
111
+ UB Bl
112
+ RR = rightrotation LR = leftrotation
113
+ '''
114
+ node .setleft (rightrotation (node .getleft ()))
115
+ return leftrotation (node )
116
+
90
117
def lrrotation (node ):
91
118
node .setright (leftrotation (node .getright ()))
92
119
return rightrotation (node )
93
120
94
- def rlrotation (node ):
95
- node .setleft (rightrotation (node .getleft ()))
96
- return leftrotation (node )
97
121
98
122
def insert_node (node ,data ):
99
123
if node is None :
100
124
return my_node (data )
101
125
if data < node .getdata ():
102
126
node .setleft (insert_node (node .getleft (),data ))
103
- if getheight (node .getleft ()) - getheight (node .getright ()) == 2 :
104
- if data < node .getleft ().getdata ():
127
+ if getheight (node .getleft ()) - getheight (node .getright ()) == 2 : #an unbalance detected
128
+ if data < node .getleft ().getdata (): #new node is the left child of the left child
105
129
node = leftrotation (node )
106
130
else :
107
- node = rlrotation (node )
131
+ node = rlrotation (node ) #new node is the right child of the left child
108
132
else :
109
133
node .setright (insert_node (node .getright (),data ))
110
134
if getheight (node .getright ()) - getheight (node .getleft ()) == 2 :
@@ -178,7 +202,7 @@ def del_node(self,data):
178
202
print ("Tree is empty!" )
179
203
return
180
204
self .root = del_node (self .root ,data )
181
- def traversale (self ):
205
+ def traversale (self ): #a level traversale, gives a more intuitive look on the tree
182
206
q = my_queue ()
183
207
q .push (self .root )
184
208
layer = self .getheight ()
0 commit comments