Skip to content

Commit fbbc2a6

Browse files
authored
Create main.swift
1 parent 15e5773 commit fbbc2a6

File tree

1 file changed

+257
-0
lines changed

1 file changed

+257
-0
lines changed
+257
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,257 @@
1+
import Foundation
2+
3+
class Node<T: Equatable>
4+
{
5+
var value: T
6+
var leftNode: Node?
7+
var rightNode: Node?
8+
var level: Int
9+
10+
init(value: T, leftNode: Node? = nil, rightNode: Node? = nil, level: Int)
11+
{
12+
self.value = value
13+
self.leftNode = leftNode
14+
self.rightNode = rightNode
15+
self.level = level
16+
}
17+
18+
func equals(node: Node<T>?) -> Bool
19+
{
20+
if(value == node?.value && level == node?.level)
21+
{
22+
return true
23+
}
24+
else
25+
{
26+
return false
27+
}
28+
}
29+
}
30+
31+
/**
32+
* AA tree
33+
* @see https://en.wikipedia.org/wiki/AA_tree
34+
*/
35+
class BinaryTree<T: Equatable & Comparable>
36+
{
37+
private var rootNode: Node<T>? = nil
38+
39+
init(value: T)
40+
{
41+
rootNode = Node<T>(value: value, leftNode: nil, rightNode: nil, level: 1)
42+
}
43+
44+
init()
45+
{
46+
rootNode = nil
47+
}
48+
49+
func insert(value: T)
50+
{
51+
insert(value: value, insertNode: &rootNode)
52+
}
53+
54+
private func insert(value: T, insertNode: inout Node<T>?) -> Node<T>?
55+
{
56+
if(insertNode == nil)
57+
{
58+
return Node<T>(value: value, leftNode: nil, rightNode: nil, level: 1)
59+
}
60+
else
61+
{
62+
if(value < insertNode!.value)
63+
{
64+
var lNode = insertNode?.leftNode
65+
insertNode?.leftNode = insert(value: value, insertNode: &lNode)
66+
}
67+
else if(value > insertNode!.value)
68+
{
69+
var rNode = insertNode?.rightNode
70+
insertNode?.rightNode = insert(value: value, insertNode: &rNode)
71+
}
72+
73+
//value = insertNode!.value not undefined
74+
75+
skew(node: &insertNode)
76+
split(node: &insertNode)
77+
}
78+
return insertNode
79+
}
80+
81+
private func split(node: inout Node<T>?)
82+
{
83+
var rNode = node?.rightNode
84+
if(rNode != nil)
85+
{
86+
if(rNode?.rightNode != nil)
87+
{
88+
if(rNode?.rightNode?.level == node?.level)
89+
{
90+
swap(&node, &rNode)
91+
rNode?.rightNode = node?.leftNode
92+
node?.leftNode = rNode
93+
node?.level+=1
94+
}
95+
}
96+
}
97+
}
98+
99+
private func skew(node: inout Node<T>?)
100+
{
101+
var lNode = node?.leftNode
102+
if(lNode != nil && node?.level == lNode?.level)
103+
{
104+
swap(&node, &lNode)
105+
lNode?.leftNode = node?.rightNode
106+
node?.rightNode = lNode
107+
}
108+
}
109+
110+
func inTree(value: T) -> Bool
111+
{
112+
return inTree(value: value, node: rootNode)
113+
}
114+
115+
private func inTree(value: T, node: Node<T>?) -> Bool
116+
{
117+
if(node == nil)
118+
{
119+
return false
120+
}
121+
else if(node?.value == value)
122+
{
123+
return true
124+
}
125+
else if(node!.value > value)
126+
{
127+
return inTree(value: value, node: node?.leftNode)
128+
}
129+
else
130+
{
131+
return inTree(value: value, node: node?.rightNode)
132+
}
133+
}
134+
135+
func bypass()
136+
{
137+
bypass(node: rootNode)
138+
}
139+
private func bypass(node: Node<T>?)
140+
{
141+
print("Node Key: ", node?.value)
142+
print("Left Key: ", terminator: "")
143+
if(node?.leftNode != nil){print(node!.leftNode!.value)} else{print("nil")}
144+
145+
print("Right Key: ", terminator: "")
146+
if(node?.rightNode != nil){print(node!.rightNode!.value)} else{print("nil")}
147+
print()
148+
149+
if(node?.leftNode != nil)
150+
{
151+
bypass(node: node?.leftNode)
152+
}
153+
if(node?.rightNode != nil)
154+
{
155+
bypass(node: node?.rightNode)
156+
}
157+
}
158+
159+
func height() -> Int
160+
{
161+
height(node: rootNode)
162+
}
163+
164+
private func height(node: Node<T>?) -> Int
165+
{
166+
var LeftCounter, RightCounter : Int
167+
168+
if(node?.leftNode != nil)
169+
{
170+
LeftCounter = height(node: node?.leftNode)
171+
}
172+
else
173+
{
174+
LeftCounter = -1
175+
}
176+
177+
if(node?.rightNode != nil)
178+
{
179+
RightCounter = height(node: node?.rightNode)
180+
}
181+
else
182+
{
183+
RightCounter = -1
184+
}
185+
186+
if(LeftCounter > RightCounter)
187+
{
188+
return LeftCounter + 1
189+
}
190+
else
191+
{
192+
return RightCounter + 1
193+
}
194+
}
195+
196+
private var last: Node<T>?
197+
private var deleted: Node<T>?
198+
199+
func delete(value: T)
200+
{
201+
delete(value: value, node: &rootNode)
202+
}
203+
204+
private func delete(value: T, node: inout Node<T>?)
205+
{
206+
if(node != nil)
207+
{
208+
//1 Go down and remember last and deleted Element
209+
last = node
210+
if(value < node!.value)
211+
{
212+
var lNode = node?.leftNode
213+
delete(value: value, node: &lNode)
214+
}
215+
else
216+
{
217+
deleted = node
218+
var rNode = node?.rightNode
219+
delete(value: value, node: &rNode)
220+
}
221+
//2 Delete Element
222+
if(node!.equals(node: last) && deleted != nil && value == deleted!.value)
223+
{
224+
deleted = nil
225+
node = node?.rightNode
226+
}
227+
else if((height(node: node?.leftNode) < height(node: node) - 1) || (height(node: node?.rightNode) < height(node: node) - 1))
228+
{
229+
//3 Balancing
230+
node!.level -= 1
231+
if(node!.rightNode!.level > node!.level)
232+
{
233+
node!.rightNode!.level = node!.level
234+
}
235+
skew(node: &node)
236+
var rNode = node?.rightNode
237+
var rrNode = rNode?.rightNode
238+
skew(node: &rNode)
239+
skew(node: &rrNode)
240+
split(node: &node)
241+
split(node: &rNode)
242+
}
243+
}
244+
}
245+
}
246+
247+
248+
var tree = BinaryTree<Int>(value: 1)
249+
tree.insert(value: 1)
250+
tree.insert(value: 2)
251+
tree.insert(value: 0)
252+
tree.insert(value: 3)
253+
tree.bypass()
254+
255+
print(tree.height())
256+
print(tree.inTree(value: 0))
257+
print(tree.inTree(value: 1000))

0 commit comments

Comments
 (0)