package rene.util.list; /** A node with a list of children trees. */ public class Tree { ListClass Children; // list of children, each with Tree as content Object Content; // content ListElement Le; // the listelement containing the tree Tree Parent; // the parent tree /** initialize with an object and no children */ public Tree (Object o) { Content=o; Children=new ListClass(); Le=null; Parent=null; } /** add a child tree */ public void addchild (Tree t) { ListElement p=new ListElement(t); Children.append(p); t.Le=p; t.Parent=this; } /** insert a child tree */ public void insertchild (Tree t) { if (!haschildren()) // simple case { addchild(t); return; } // give t my children t.Children=Children; // make t my only child Children=new ListClass(); ListElement p=new ListElement(t); Children.append(p); t.Le=p; t.Parent=this; // fix the parents of all grandchildren ListElement le=t.Children.first(); while (le!=null) { Tree h=(Tree)(le.content()); h.Parent=t; le=le.next(); } } /** remove the specific child tree (must be in the tree!!!) */ public void remove (Tree t) { if (t.parent()!=this) return; Children.remove(t.Le); } /** remove all children */ public void removeall () { Children.removeall(); } // Access Methods: public boolean haschildren () { return Children.first()!=null; } public Tree firstchild () { return (Tree)Children.first().content(); } public Tree lastchild () { return (Tree)Children.last().content(); } public Tree parent () { return Parent; } public ListClass children () { return Children; } public Object content () { return Content; } public void content (Object o) { Content=o; } public ListElement listelement () { return Le; } }