NAME

Tree::MultiNode -- a multi-node tree object. Most useful for modeling hierarchical data structures.

SYNOPSIS

use Tree::MultiNode;
use strict;
use warnings;
my $tree   = Tree::MultiNode->new;
my $handle = Tree::MultiNode::Handle->new($tree);

$handle->set_key("top");
$handle->set_value("level");

$handle->add_child("child","1");
$handle->add_child("child","2");

$handle->first();
$handle->down();

$handle->add_child("grandchild","1-1");
$handle->up();

$handle->last();
$handle->down();

$handle->add_child("grandchild","2-1");
$handle->up();

$handle->top();
&dump_tree($handle);

my $depth = 0;
sub dump_tree
{
  ++$depth;
  my $handle = shift;
  my $lead = ' ' x ($depth*2);
  my($key,$val);

  ($key,$val) = $handle->get_data();

  print $lead, "key:   $key\n";
  print $lead, "val:   $val\n";
  print $lead, "depth: $depth\n";

  my $i;
  for( $i = 0; $i < scalar($handle->children); ++$i ) {
    $handle->down($i);
      &dump_tree($handle);
    $handle->up();
  }
  --$depth;
}

DESCRIPTION

Tree::MultiNode, Tree::MultiNode::Node, and MultiNode::Handle are objects modeled after C++ classes that I had written to help me model hierarchical information as data structures (such as the relationships between records in an RDBMS). The tree is basically a list of lists type data structure, where each node has a key, a value, and a list of children. The tree has no internal sorting, though all operations preserve the order of the child nodes.

Creating a Tree

The concept of creating a handle based on a tree lets you have multiple handles into a single tree without having to copy the tree. You have to use a handle for all operations on the tree (other than construction).

When you first construct a tree, it will have a single empty node. When you construct a handle into that tree, it will set the top node in the tree as it's current node.

my $tree   = Tree::MultiNode->new;
my $handle = Tree::MultiNode::Handle->new($tree);

Using a Handle to Manipulate the Tree

At this point, you can set the key/value in the top node, or start adding child nodes.

$handle->set_key("blah");
$handle->set_value("foo");

$handle->add_child("quz","baz");
# or
$handle->add_child();

add_child can take 3 parameters -- a key, a value, and a position. The key and value will set the key/value of the child on construction. If pos is passed, the new child will be inserted into the list of children.

To move the handle so it points at a child (so you can start manipulating that child), there are a series of methods to call:

$handle->first();   # sets the current child to the first in the list
$handle->next();    # sets the next, or first if there was no next
$handle->prev();    # sets the previous, or last if there was no next
$handle->last();    # sets to the last child
$handle->down();    # positions the handle's current node to the
                    # current child

To move back up, you can call the method up:

$handle->up();      # moves to this node's parent

up() will fail if the current node has no parent node. Most of the member functions return either undef to indicate failure, or some other value to indicate success.

$Tree::MultiNode::debug

If set to a true value, it enables debugging output in the code. This will likely be removed in future versions as the code becomes more stable.

API REFERENCE

Tree::MultiNode

The tree object.

Tree::MultiNode::new

@param    package name or tree object [scalar]
@returns  new tree object

Creates a new Tree. The tree will have a single top level node when created. The first node will have no value (undef) in either it's key or it's value.

my $tree = Tree::MultiNode->new;

SEE ALSO

Algorithms in C++ Robert Sedgwick Addison Wesley 1992 ISBN 0201510596

The Art of Computer Programming, Volume 1: Fundamental Algorithms, third edition, Donald E. Knuth

AUTHORS

Kyle R. Burton <mortis@voicenet.com> (initial version, and maintenence)

Daniel X. Pape <dpape@canis.uiuc.edu> (see Changes file from the source archive)

Eric Joanis <joanis@cs.toronto.edu>

Todd Rinaldo <toddr@cpan.org>

BUGS

Please report bugs via the issue tracker at https://github.com/cpan-authors/Tree-MultiNode/issues.

LICENSE

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic and perlgpl.