Introduction
For more than a year and a half I have had to use some kind of multi-node tree to do
something. However, all I found from the Internet are binary trees or equivalents.
I therefore decided to write my own. Because I had to finish it pretty fast, I spent only
two days for it, so it may be buggy.
In the project, it has three classes working like in STL container-iterator style.
template <class Key, class T> class Tree
template <class Key, class T> class Tree_iterator
template <class Key, class T> class TreeNode
A tree contains many tree nodes, while tree nodes contain data. Tree nodes of a tree are called
children. In the design each node is assigned a level and the root node is of level 1.
Tree_iterator
is for navigation within the tree. Two tree-walk styles are defined. One walks down from the root node,
while the other one use post-style to walk through all children of the tree. For each walk action,
a
tree_iterator
is returned, so the user can use the iterator to reference the tree node and get the data.
I wrapped all the classes under the namespace Tiffany. For example, declaration of the tree with key type
of wstring
, and node data type of string, and add two levels of element is like:
Tiffany::Tree<wstring, string> x(L"Node 1", "Root");
px = x.AddChild(L"Key1","A");
px1 = x.AddChild(px, L"Key2", "1");
For a walk down action, you can limit it to a part of a tree
("sub-tree") by using the function SetSubTreePivot(px)
, and you can set the pivot
to point back to the root node by calling SetWalkDownRootPivot. Try it out!. You can even delete part of the tree by calling
DelSubTree()
.
Unfortunately I didn't have much time to prepare this document, but it should
be obvious how to the classes.