Compare commits

...

3 Commits

Author SHA1 Message Date
Tristan B. Velloza Kildaire e2fd7b0553
Merge a5f7e9fc95 into 6b12529ec3 2024-04-27 14:42:22 +00:00
Tristan B. Velloza Kildaire a5f7e9fc95 VisitationTree
- Documented
2024-04-27 16:42:07 +02:00
Tristan B. Velloza Kildaire 926598086d VisitationTree
- Documented
2024-04-27 16:25:47 +02:00
1 changed files with 64 additions and 1 deletions

View File

@ -872,26 +872,76 @@ unittest
assert(!treeOfStrings.removeNode(subtree_1)); assert(!treeOfStrings.removeNode(subtree_1));
} }
/**
* A kind-of a tree which has the ability
* to linearize all of its nodes which
* results in performing a depth first
* search resulting in the collection of
* all nodes into a single array with
* elements on the left hand side being
* the most leafiest (and left-to-right
* on the same depth are in said order).
*
* It also marks a node as visited on
* entry to it via the dfs call to it.
*
* When dfs is performed, a child node
* is only recursed upon if it has not
* yet been visited.
*
* With all this, it means a graph of
* relations can be flattened into an
* array.
*/
public class VisitationTree(T) : Tree!(T) public class VisitationTree(T) : Tree!(T)
{ {
private bool visisted; private bool visisted;
/**
* Constructs a new node
*
* Params:
* value = the value
*/
this(T value) this(T value)
{ {
super(value); super(value);
} }
/**
* Performs the linearization
*
* Returns: the linearized list
*/
public T[] linearize() public T[] linearize()
{ {
return dfs(toDelegate(&_shouldVisit), toDelegate(&_touch)); return dfs(toDelegate(&_shouldVisit), toDelegate(&_touch));
} }
/**
* The inclusion startergy
*
* Params:
* tnode = the tree node
* Returns: `true` if not
* yet visited or incompatible
* node type
*/
private static bool _shouldVisit(Tree!(T) tnode) private static bool _shouldVisit(Tree!(T) tnode)
{ {
VisitationTree!(T) vnode = cast(VisitationTree!(T))tnode; VisitationTree!(T) vnode = cast(VisitationTree!(T))tnode;
return vnode && !vnode.isVisited(); return vnode && !vnode.isVisited();
} }
/**
* The touching stratergy
*
* Only works on compatible
* tree nodes
*
* Params:
* tnode = the tree node
*/
private static void _touch(Tree!(T) tnode) private static void _touch(Tree!(T) tnode)
{ {
VisitationTree!(T) vnode = cast(VisitationTree!(T))tnode; VisitationTree!(T) vnode = cast(VisitationTree!(T))tnode;
@ -901,17 +951,31 @@ public class VisitationTree(T) : Tree!(T)
} }
} }
/**
* Marks this node as
* visited
*/
private void mark() private void mark()
{ {
this.visisted = true; this.visisted = true;
} }
/**
* Checks this node has been
* visited
*
* Returns: `true` if visited,
* otherwise `false`
*/
private bool isVisited() private bool isVisited()
{ {
return this.visisted; return this.visisted;
} }
} }
/**
* Tests out using the visitation tree
*/
unittest unittest
{ {
VisitationTree!(string) root = new VisitationTree!(string)("root"); VisitationTree!(string) root = new VisitationTree!(string)("root");
@ -925,5 +989,4 @@ unittest
assert(linearized[0] == "subtree"); assert(linearized[0] == "subtree");
assert(linearized[1] == "root"); assert(linearized[1] == "root");
} }