-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathavl_tree_copied.py
158 lines (131 loc) · 4.28 KB
/
avl_tree_copied.py
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
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
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import random
import time
import sys
import argparse
class AVLTree(object):
def __init__(self):
self.root = None
class __Node(object):
def __init__(self, val):
self.val = val
self.right = None
self.left = None
self.height = 1
def __bfactor(self, node):
return self.__height(node.right) - self.__height(node.left)
def insertval(self, val):
self.root = self.__insert(self.root, val)
def __insert(self, node, val):
if node == None:
node = self.__Node(val)
return node
if val == node.val:
raise Exception("val already in tree")
if (val < node.val):
# print val, node.val
node.left = self.__insert(node.left, val)
else:
node.right = self.__insert(node.right, val)
return self.__balance(node)
def __fixheight(self, node):
node.height = max(self.__height(node.right), self.__height(node.left)) + 1
def __height(self, node):
if node != None:
return node.height
else:
return 0
def __rotateLeft(self, node):
p = node.right
node.right = p.left
p.left = node
self.__fixheight(p)
self.__fixheight(node)
return p
def __rotateRight(self, node):
q = node.left
node.left = q.right
q.right = node
self.__fixheight(node)
self.__fixheight(q)
return q
def __balance(self, node):
self.__fixheight(node)
if self.__bfactor(node) == 2:
if self.__bfactor(node.right) < 0:
node.right = self.__rotateRight(node.right)
return self.__rotateLeft(node)
if self.__bfactor(node) == -2:
node.left = self.__rotateLeft(node.left)
return self.__rotateRight(node)
return node
def __bfs_sort(self, node, vals_sorted):
if node == None:
return
self.__bfs_sort(node.left, vals_sorted)
vals_sorted.append((node.val, node.height))
self.__bfs_sort(node.right, vals_sorted)
def sorted(self):
vals_sorted = list()
self.__bfs_sort(self.root, vals_sorted)
return vals_sorted
def merge_sort(data):
def __merge(list1, list2):
res = list()
#print list1, list2
i1 = i2 = 0
while i1 < len(list1) and i2 < len(list2):
if list1[i1] < list2[i2]:
elem = list1[i1]
i1 += 1
else:
elem = list2[i2]
i2 += 1
res.append(elem)
res.extend(list1[i1:])
res.extend(list2[i2:])
#print "Result is", res
return res
if len(data) == 1:
return data
middle = len(data) / 2
left = merge_sort(data[:middle])
right = merge_sort(data[middle:])
return __merge(left, right)
def main(argv):
fill = 'random'
nElem = 1000
w = nElem
q = 0
n = 10
# parser = argparse.ArgumentParser(description='Sorting algorithms comparison')
# parser.add_argument('--fill', metavar='FILL', type=str,
# help='fill for integer list')
# parser.add_argument('--n', type = int, metavar = 'n',
# help ='Number of elements in list')
# parser.add_argument('--q', type = int, metavar = 'q',
# help ='Lower bound of element')
# parser.add_argument('--w', type = int, metavar = 'w',
# help ='Upper bound of element')
# args = parser.parse_args(argv)
# print(args)
numbers = random.sample(range(q,w), n)
numbers = list(range(1, 10))
# random.shuffle(numbers)
# start_time = time.clock()
# sorted_numbers = merge_sort(numbers)
# print time.clock() - start_time
# print sorted_numbers[0], sorted_numbers[-1]
tree = AVLTree()
random.shuffle(numbers)
for i in numbers:
tree.insertval(i)
print(tree.root.val, tree.root.height)
print(tree.sorted())
from breadth_first_search import breadthFirstSearch
breadthFirstSearch(tree.root)
start_time = time.clock()
nsorted = tree.sorted()
# print time.clock() - start_time
# print nsorted[0], nsorted[-1]
if __name__ == "__main__":
sys.exit(main(sys.argv))