16 #ifndef INC_KY_Kernel_SplayTree_H
17 #define INC_KY_Kernel_SplayTree_H
63 template<
class T,
class Accessor>
class SplayTree
67 SplayTree() : Root(0) {}
69 void Clear() { Root = 0; }
74 static T* Splay(T** root,
const T& key)
81 Accessor::ClearLinks(&n);
88 if (Accessor::Less(key, *t))
90 if (Accessor::GetChild(t, 0) == 0)
95 if (Accessor::Less(key, *Accessor::GetChild(t, 0)))
97 y = Accessor::GetChild(t, 0);
98 Accessor::SetChild(t, 0, Accessor::GetChild(y, 1));
99 Accessor::SetChild(y, 1, t);
102 if (Accessor::GetChild(t, 0) == 0)
108 Accessor::SetChild(r, 0, t);
110 t = Accessor::GetChild(t, 0);
112 else if (Accessor::Less(*t, key))
114 if (Accessor::GetChild(t, 1) == 0)
119 if (Accessor::Less(*Accessor::GetChild(t, 1), key))
121 y = Accessor::GetChild(t, 1);
122 Accessor::SetChild(t, 1, Accessor::GetChild(y, 0));
123 Accessor::SetChild(y, 0, t);
126 if (Accessor::GetChild(t, 1) == 0)
132 Accessor::SetChild(l, 1, t);
134 t = Accessor::GetChild(t, 1);
142 Accessor::SetChild(l, 1, 0);
143 Accessor::SetChild(r, 0, 0);
144 Accessor::SetChild(l, 1, Accessor::GetChild(t, 0));
145 Accessor::SetChild(r, 0, Accessor::GetChild(t, 1));
146 Accessor::SetChild(t, 0, Accessor::GetChild(&n, 1));
147 Accessor::SetChild(t, 1, Accessor::GetChild(&n, 0));
155 void Insert(T* n, T* t)
159 Accessor::ClearLinks(n);
161 else if (Accessor::Less(*n, *t))
163 Accessor::SetChild(n, 0, Accessor::GetChild(t, 0));
164 Accessor::SetChild(n, 1, t);
165 Accessor::SetChild(t, 0, 0);
169 Accessor::SetChild(n, 1, Accessor::GetChild(t, 1));
170 Accessor::SetChild(n, 0, t);
171 Accessor::SetChild(t, 1, 0);
184 T* t = Splay(&Root, *n);
185 if (t && Accessor::Equal(*t, *n))
197 void Remove(T* t,
bool splayed =
false)
206 if (Accessor::Equal(*x, *t))
208 if (Accessor::GetChild(t, 0) == 0)
210 x = Accessor::GetChild(t, 1);
214 x = Splay(Accessor::GetChildPtr(t, 0), *t);
215 Accessor::SetChild(x, 1, Accessor::GetChild(t, 1));
219 Accessor::ClearLinks(t);
224 const T* FindEqual(
const T& key)
const
226 const T* node = Root;
227 while(node && !Accessor::Equal(*node, key))
229 node = Accessor::GetChild(node, Accessor::Less(*node, key));
236 const T* FindGrEq(
const T& key)
const
238 const T* node = Root;
242 if (Accessor::Less(*node, key))
244 node = Accessor::GetChild(node, 1);
249 node = Accessor::GetChild(node, 0);
257 const T* FindLeEq(
const T& key)
const
259 const T* node = Root;
263 if (Accessor::Less(key, *node))
265 node = Accessor::GetChild(node, 0);
270 node = Accessor::GetChild(node, 1);
283 template<
class T,
class Accessor>
class SplayTreeMulti
290 T* t = Tree.Splay(&Tree.Root, *n);
292 if (t == 0 || !Accessor::Equal(*t, *n))
296 n->pPrev = n->pNext = 0;
312 void Remove(T* n,
bool splayed =
false)
319 n->pPrev->pNext = n->pNext;
321 n->pNext->pPrev = n->pPrev;
337 x = Tree.Splay(&x, *n);
339 if (x && Accessor::Equal(*x, *n))
341 Accessor::SetChild(t, 0, Accessor::GetChild(x, 0));
342 Accessor::SetChild(t, 1, Accessor::GetChild(x, 1));
344 Tree.Root = (T*)n->pNext;
349 Tree.Remove(n,
false);
355 T* PullBestGrEq(
const T& key)
357 T* node = Tree.Splay(&Tree.Root, key);
360 if (node && Accessor::Less(*node, key))
363 if ((node = Accessor::GetChild(node, 1)) != 0)
365 while (Accessor::GetChild(node, 0))
366 node = (T*)Accessor::GetChild(node, 0);
376 node = (T*)node->pNext;
378 Remove(node, splayed);
385 T* PullBestLeEq(UPInt key)
391 SplayTree<T, Accessor> Tree;
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17