-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsplay.py
More file actions
96 lines (88 loc) · 2.33 KB
/
splay.py
File metadata and controls
96 lines (88 loc) · 2.33 KB
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
class Node:
def __init__(self,key):
self.left=None
self.right=None
self.key=key
class Tree:
def __init__(self,r):
self.root=r
self.header = Node(None) #For splay()
def insert(self,r,key):
if self.root:
if key < r.key:
if r.left==None:
r.left=Node(key)
else:
self.insert(r.left,key)
if key > r.key:
if r.right==None:
r.right=Node(key)
else:
self.insert(r.right,key)
else:
self.root=r
def retkey(self):
return(self.root.key)
def retroot(self):
return(self.root)
def splay(self, key):
le = ri = self.header
t = self.root
self.header.left = self.header.right = None
while True:
if key < t.key:
if t.left == None:
break
if key < t.left.key:
y = t.left
t.left = y.right
y.right = t
t = y
if t.left == None:
break
ri.left = t
ri = t
t = t.left
elif key > t.key:
if t.right == None:
break
if key > t.right.key:
y = t.right
t.right = y.left
y.left = t
t = y
if t.right == None:
break
le.right = t
le = t
t = t.right
else:
break
le.right = t.left
ri.left = t.right
t.left = self.header.right
t.right = self.header.left
self.root = t
def printlist(self,r):
if r.left:
self.printlist(r.left)
print(r.key)
if r.right:
self.printlist(r.right)
r=Node(10)
k=Tree(r)
k.insert(r,6)
k.insert(r,12)
k.insert(r,3)
k.insert(r,34)
k.insert(r,1)
k.insert(r,25)
k.printlist(r)
print("root before splay");
print(k.retkey())
k.splay(6)
print("root after splay")
print(k.retkey())
print("list of elements")
root=k.retroot()
k.printlist(root)