public void Traverse(TreeVisitor <T> visitor, TreePreTraverse previsitor, TreePostTraverse postvisitor, int ignoredepth = -1)
 {
     this.traverse((NTree <T>) this, visitor, previsitor, postvisitor, ignoredepth);
 }
 private void traverse(NTree <T> node, TreeVisitor <T> visitor, TreePreTraverse previsitor, TreePostTraverse postvisitor, int ignoredepth)
 {
     if (((visitor == null) || (ignoredepth >= 0)) || visitor(node.data))
     {
         foreach (NTree <T> tree in node.children)
         {
             if ((previsitor != null) && (ignoredepth < 0))
             {
                 previsitor();
             }
             this.traverse(tree, visitor, previsitor, postvisitor, ignoredepth - 1);
             if ((postvisitor != null) && (ignoredepth < 0))
             {
                 postvisitor();
             }
         }
     }
 }