I meant a general tree or graph abstraction. There are several tree-like
structures, but each has its own public interface (e.g. Xml classes,
ASP.NET/Winforms/WPF/etc. control hierarchies, tree view, etc.).

Btw, there is another (and quite different) generic RB tree implementation
in .NET, in System.Data (RBTree<K>, internal).

Sébastien

On 7/27/07, Greg Young <[EMAIL PROTECTED]> wrote:
>
> I don't want to change the
> topic, but I find it surprising that there is no tree and/or graph
>
> i dont want to get too far off topic either but sorteddictionary<t> is
> a rb tree.
>
>
> On 7/27/07, Sébastien Lorion <[EMAIL PROTECTED]> wrote:
> > I will answer you and Stoyan in one go ...
> >
> > My goal is to have a general purpose base implementation. First concern
> is
> > usability and correctness/completeness of object model in the long term.
> I
> > can always change the concrete implementation later on.
> > I am trying to abstract away and put in common
> > as much as possible about what you can do with a tree, e.g.
> > traversals. I see this implementation as a base for specialized trees,
> > like binary,
> > ternary, RB tree, heaps, treaps, tries, etc. I don't want to change the
> > topic, but I find it surprising that there is no tree and/or graph
> > abstractions at all in the .NET framework.
> >
> > Here is the skeleton of my current model (sorry if formatting gets
> wrong).
> >
> > public interface IReadOnlyTree
> >   : IEnumerable
> > {
> >   ITreeNode Root { get;}
> >   CacheOption CountCacheOption { get;} // can be NoCache,
> > DiscardAfterChange, UpdateAfterChange
> >
> >   bool Contains(ITreeNode node);
> >   int CalculateCount();
> > }
> >
> > public interface ITree
> >   : IReadOnlyTree
> > {
> >   new ITreeNode Root { get;set;}
> >   new CacheOption CountCacheOption { get;set;}
> >
> >   void AddFirst(ITreeNode child, ITreeNode parent);
> >   void AddLast(ITreeNode child, ITreeNode parent);
> >
> >   void InsertBefore(ITreeNode newChild, ITreeNode refChild);
> >   void InsertAfter(ITreeNode newChild, ITreeNode refChild);
> >
> >   void Remove(ITreeNode node);
> >   void RemoveAllChildNodes(ITreeNode parent);
> >
> >   void ReplaceNode(ITreeNode newNode, ITreeNode oldNode);
> >   void SwapNodes(ITreeNode nodeA, ITreeNode nodeB);
> > }
> >
> > public interface ITreeNode
> >   : IEnumerable
> > {
> >   object Value { get;set;}
> >   ITreeNode Parent { get;}
> >   bool HasChildNodes { get;}
> >   int Count { get;}
> >
> >   ITreeNode this[int index] { get;}
> >   int IndexOf(ITreeNode node);
> > }
> >
> > There is also a Algorithms static class (thinking about decomposing it
> to
> > not get a monster class like in PowerCollections).
> > Also have various traversal enumerators like Pre/In/PostOrderEnumerator,
> > BreadthFirstEnumerator, etc.
> >
> > In the case where the nodes store their children locally, the TreeNode
> class
> > offers internal methods that the Tree class uses to do its operations.
> >
> > In the case where the relationships are stored centrally, the nodes are
> much
> > more lightweight in term of code as most operations gets delegated to
> the
> > tree and there is no need to have internal methods.
> >
> > In the tree-as-a-node approach you describe,
> > I am curious about where exactly you store the relationships between the
> nodes.
> > I get the general idea and it is something I have explored, but
> > I would like to have more details on your implementation.
> >
> > Sébastien
> >
> > On 7/26/07, Barry Kelly <[EMAIL PROTECTED]> wrote:
> > >
> > > Sébastien Lorion <[EMAIL PROTECTED]> wrote:
> > >
> > > > Considering that operations on the tree are centralized in the Tree
> > > class,
> > >
> > > By making this assertion, IMO you've pre-selected a particular notion
> of
> > > interacting with a tree.
> > >
> > > Usually, when I work with a tree, my node *is* my tree (i.e. it's the
> > > root of the tree). What's more, I often don't store parent pointers
> and
> > > instead rely on e.g. visiting algorithms to store the parent stack
> > > during a recursive traversal, if such parents are required for certain
> > > operations. And taking a leaf (ahem) from the pages of functional
> > > programming, when parent pointers are eliminated, subtrees may be
> shared
> > > between multiple trees, since my nodes are often read-only after
> > > construction (and thus aliasing issues aren't important).
> > >
> > > There's more down this branch too: persistent datastructures often
> rely
> > > on the logarithmic performance of operations on trees to permit
> keeping
> > > e.g. undo-state around quite cheap.
> > >
> > > Can you say more about your particular tree?
> > >
> > > -- Barry
> > >
> > > --
> > > http://barrkel.blogspot.com/
> > >
> > > ===================================
> > > This list is hosted by DevelopMentor(r)  http://www.develop.com
> > >
> > > View archives and manage your subscription(s) at
> > > http://discuss.develop.com
> > >
> >
> >
> >
> > --
> > Sébastien
> > www.sebastienlorion.com
> >
>
>
> --
> Studying for the Turing test
>
> ===================================
> This list is hosted by DevelopMentor(r)  http://www.develop.com
>
> View archives and manage your subscription(s) at
> http://discuss.develop.com
>



-- 
Sébastien
www.sebastienlorion.com

Reply via email to