Rekursive Knotenerzeugung

Wolfsbein

Erfahrenes Mitglied
Hallo

ich sitze jetzt schon, ohne Übertreibung, einige Stunden mit dem berühmten Brett vorm Kopf vor diesem Problem:
Ausgangsknoten A in einer Baumklasse mit den Attributen next, data, child und sibling.
Relevant ist hier nur sibling. Wie kann ich möglichst einfach dem Knoten A eine Kette von siblings anhängen? Wenns statisch wäre könnte ich ja schreiben
A.sibling = new Node();
A.sibling.sibling = new Node();
Genau das kann ich aber nicht. Ein Denkanstoss reicht mir evtl schon. Danke.
 
Hallo!

Wie wär's denn damit:

Siblings sind "Geschwister" und um nicht "unnötig" Speicher zu verbrauchen sollte man sie über den Parent beziehen. Man könnte beispielsweise sagen:
"Die Geschwister eines Knotes sind alle Kinder des Vaters dieses jeweiliegen Knotens ohne den Knoten selbst".

Code:
/*
 * Created on 22.01.2005@14:23:34
 *
 * TODO Licence info
 */
package de.tutorials;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class TreeNode {
	protected Object data;

	protected TreeNode parent;

	// ? auf "wen" soll next verweisen ?
	protected TreeNode next;

	// Kind elemente
	protected List<TreeNode> children;

	public TreeNode(TreeNode parent, Object data) {
		this.parent = parent;
		this.data = data;
		this.children = new ArrayList<TreeNode>();
	}

	//Geschwister-Elemente
	protected List<TreeNode> getSiblings() {
		if (parent == null)
			return Collections.EMPTY_LIST;
		List<TreeNode> list = new ArrayList<TreeNode>(parent.getSiblings());
		list.remove(this);
		return Collections.unmodifiableList(list);
	}
}

Code:
/*
 * Created on 22.01.2005@14:03:19
 *
 * TODO Licence info
 */
package de.tutorials;

import java.util.Iterator;

/**
 * @author Darimont
 * 
 * TODO Explain me
 */
public class TreeExample {

	public static void main(String[] args) {
		new TreeExample().doIt();
	}

	private void doIt() {
		// TODO Auto-generated method stub
		TreeNode root = new TreeNode(null, "root");
		generateSomeChilds(root, 0);

		printTree(root);
	}

	/**
	 * @param root
	 */
	private void printTree(TreeNode node) {
		if (node.children != null && node.children.size() > 0) {
			for (Iterator<TreeNode> iter = node.children.iterator(); iter
					.hasNext();) {
				printTree(iter.next());
			}
		}
		System.out.println(node.data);
	}

	private void generateSomeChilds(TreeNode root, int level) {
		if (level >= 3)
			return;
		for (int i = 0; i < 4; i++) {
			TreeNode node = new TreeNode(root, "[" + root.data + "]" + "->data"
					+ i);
			root.children.add(node);
			generateSomeChilds(node, ++level);
		}
	}
}

Gruß Tom
 
Danke, aber das ist für die Sache schon Overkill ;). Ich habs jetzt so gemacht:
Code:
private TreeNode createSiblings(TreeNode child, String replace) {
        
        TreeNode node = child;
        
        for (int i = 1; i < replace.length(); i++) {
            
            node.sibling = new TreeNode(replace.substring(i, i + 1), 
                    child.depth);
            node = buildTree(node.sibling);
        }
        return child;
    }
 
Zurück