|
|
13.09.2011
|
|
|
|
So ist es. Man brauch dann eine Kreiserkennung als Abbruchkriterium. Das kann man dadurch erreichen indem man beim Hinzufügen eines Knotens prüft, ob derselbe Knoten bereits in der Kette zwischen Start-und aktuellem Knoten vorkommt.
– puls200 13.09.2011
|
||
|
Ein gerichteter Graph, um genau zu sein (http://de.wikipedia.org/wiki/Graph_%28Graphentheorie%29#Gerichteter_Graph). Jedenfalls würde ich die Aufgabenstellung so interpretieren, denn sonst ergibt es m.E. keinen Sinn, von Parent und Child zu sprechen. Was mir jetzt aber nicht klar ist: heißt "können vorkommen", dass die zu erzeugende Struktur kein Baum sein muss, sondern allg. ein ger. Graph sein darf, oder heißt es, daß die Erzeugung der Baumstruktur mit einem Fehler abbrechen soll, wenn sich herausstellt, dass kein Baum vorliegt?
– Matthias Hlawatsch 13.09.2011
|
||
|
Hier noch ein Link zur Zyklensuche:
http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo35.php – Matthias Hlawatsch 13.09.2011
|
||
|
@Neues Mitglied: "einfach mehrfach im Baum vorkommen" - das verstehe ich nicht. Erstens ist es mit Kreis kein Baum mehr, zweitens ist ein Knoten in einem Graph immer genau einmal enthalten, sonst ergibt die ganze Begriffsbildung keinen Sinn mehr.
– Matthias Hlawatsch 13.09.2011
|
||
|
Kreis:
1 |_2 ..|_3 ....|_1 Da die 1 schon im Baum (Graph, Organigramm oder wie man es auch nennen mag) schon enthalten ist sollen die Kinder nicht mehr angezeigt werden. Ein Baum mit mehreren Eltern sollte dann so aussehn: 1 |_2 ..|_4 |_3 ..|_4 Wenn 4 auch auch noch Kinder hat, dann sollen diese Kinder nur beim erstmaligen Vorkommen des Knotens 4 angezeigt werden. – Gast 13.09.2011
|
||
|
OK, so langsam verstehe ich. Dann trenne die interne Repräsentation der Datenstruktur von der Darstellung. Der Algorithmus in meiner Antwort bleibt, wie er ist, auch die Datenstruktur (die dann einen ger. Graph repräsentiert). Für die Anzeige fängst Du beim Wurzelknoten an und merkst Dir, welche Knoten Du schon anzeigt hast. Kommt ein Knoten ein zweites Mal vor, wird nur noch er selbst angezeigt, aber nicht mehr seine Kinder.
– Matthias Hlawatsch 13.09.2011
|
||
|
@Neues Mitglied:
Zitat: "Je nach dem welche Parent-ID ich angebe, ..." Das widerspricht aber der Aussage, dass der Baum mehrere Eltern haben kann. Entweder man gibt eine ParentId vor, dann hat man nur eine oder man kann mehrere haben. In deinem Kommentar hat dein Graph die Eltern 1 und 3. Kannst du das nochmals genauer beschreiben? PS: Die Aufgabe ist interessant. – Jürgen Luhr 13.09.2011
|
using System;
public class Node
{
public Guid Id;
public Guid ParentId;
public Node Parent;
public List<Node> Children = new List<Node>();
public static Node TreeFromNode(Guid rootId, List<Node> unsortedList)
{
foreach (Node node in unsortedList)
{
if (node.Id == rootId)
{
AddSubNodes(node, unsortedList);
}
}
}
public static void AddSubNodes(Node currentNode, List<Node> allNodes)
{
foreach (Node node in allNodes)
{
if (node.ParentId == currentNode.Id) // child found
{
currentNode.Children.Add(node);
node.Parent = currentNode;
}
if(!IsNodeInPath(currentNode, node.Id))
AddSubNodes(node, allNodes);
}
}
public static bool IsNodeInPath(Node node, Guid id)
{
if (node.Id == id) return true;
if (node.Parent != null)
return IsNodeInPath(node.Parent, id);
return false;
}
}
|
|
|
Hm, hier fällt mir sofort auf, dass Du von genau einem Parent pro Node ausgehst. Der OP (gibt es eine deutsche Abkürzung für Original Poster?) hat aber inzwischen klargestellt, dass ein Knoten mehrere Eltern haben kann.
– Matthias Hlawatsch 13.09.2011
|
||
|
Ja, im jeweiligen Zweig. Es heisst ja nicht dass ein Knoten nicht in mehreren Zweigen vorkommen kann (und damit diese Bed. erfüllt ist). Der OP (klingt doch gut! :-) ) möchte den Graphen doch ab einem definierten Punkt ausgeben.
– puls200 13.09.2011
|
||
|
|
Kreise können ebenso vorkommen wie Mehrfachreferenzen, also Knoten mit mehreren Eltern.