[Cologne-pm] table zu tree konvertieren

Michael Lamertz mike at lamertz.net
Thu Nov 16 04:53:09 PST 2006


Wie jetzt, ein Perler, der kein Lisp kann?  >:->

Node->new ist dreckig und sollte ggf. korrekt implementiert werden.

Ich bin jetzt davon ausgegangen, dass Deine Liste derart sortiert ist,
dass ein Parent existiert, wenn man die Child-Node in die Finger
bekommt, und die Liste von hinten nach vorne durcharbeitet.  Falls diese
Bedingung in Deinen Daten nicht erfuellt ist, musst Du halt vorher ein
bisschen sortieren...

Zum Verfahren:

Du nimmst ein node_id/parent_id Paar in die Hand.  Zur node_id erzeugst
Du ein neues Node-Objekt.  Dann laesst Du ein 'find' ab der Root-Node
auf den Baum los, in dem Du die parent_id suchst.  Die zurueckgelieferte
Referenz auf den Parent-Knoten wird dann benutzt, um die neue Node dort
einzuhaengen (push @{$parent->{children}}, $node).

Ist jetzt ein Schnellschuss, sollte Dich aber up-and-running bringen.

---------- snip ----------
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

package Node;

sub new { return bless { id => $_[1] }, __PACKAGE__; }

sub insert {
    my ($self, $node, $parent_id) = @_;
    my $parent = $self->find($parent_id);
    push @{$parent->{children}}, $node;
}

sub find {
    my ($self, $id) = @_;
    return $self if $self->{id} == $id;
    foreach my $child (@{$self->{children}}) {
	my $res = find($child, $id);
	return $res if $res;
    }
}

package main;

chomp(my @lines = <DATA>);

my $root = Node->new(-1);
while ($_ = pop @lines) {
    my ($node_id, $parent_id) = split ' ';

    $root->insert(Node->new($node_id), $parent_id);
}

$Data::Dumper::Indent = 1;
print Dumper($root);

__DATA__
101	202
202	303
145	132
132	303
303	-1
---------- snip ----------


Gruss - Michael

-- 
	    Well, then let's give that Java-Wussie a beating... (me)

Michael Lamertz                        |     +49 2234 204947 / +49 171 6900 310
Sandstr. 122                           |                       mike at lamertz.net
50226 Frechen                          |                 http://www.lamertz.net
Germany                                |               http://www.perl-ronin.de 


More information about the Cologne-pm mailing list