Methode um Struktur eines Binäbaumes auszugeben

DASEFX

Mitglied
Hallo,

kann mir jemand einen Tipp geben wie ich eine Methode erstelle zur Ausgabe eines Binärbaumes der Art:
-----------5
---------|-----|
--------4 ------6
------|----|---|---|
-----2-----3---7---8
Ich komme da einfach nicht weiter ich bekomme es nur so hin???:L:
---5
|-----|
4-----6
|-----|
2-----7
|-----|
3-----8
Ich müsste ja quasi bei jeden knoten einzeln eine links und rechts struktur aufbauen wie geht das?
 
Zuletzt bearbeitet:
Mein Baum steht schon ich habe auch Methoden zum traversieren,sortieren usw. ich möchte jediglich eine Methode schreiben die den Baum quasi zeichnet so wie oben beschrieben
 
Den Baum so "schön mittig" auszugeben kann kompliziert sein - da muss man auch rum-berechnen, wie breit der String ist, der für die Blätter ausgegeben wird usw. Deutlich(!) einfacher ist sowas wie die "Dateisystem-Explorer-Ansicht":
Code:
A
  B
    D
    E
  C
    F
    G
 
In swing könnteste das hiermit machen: DefaultMutableTreeNode
Wennde dich mit Swing auskennst ist das nen fall von 10 Minuten

Java:
private void exportBinaryTree() {
		JFrame frame = new JFrame("KodierBaum");
		frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		DefaultMutableTreeNode masterdescriptor = new DefaultMutableTreeNode(
				"Masternode total:" + this.masternode.getProbability());
		JTree tree = new JTree(masterdescriptor);
		frame.add(new JScrollPane(tree));
		addAllChilds(this.masternode, masterdescriptor);
		frame.pack();
		frame.setVisible(true);
	}

	private void addAllChilds(BinaryNode parent,
			DefaultMutableTreeNode descriptor) {
		BinaryNode nodea = parent.getChilda();
		if (nodea != null) {
			DefaultMutableTreeNode adescr = new DefaultMutableTreeNode(
					"ChildA P:" + nodea.getProbability() + " B:"
							+ nodea.getBitvalue() + " L:" + nodea.getLetter());
			descriptor.add(adescr);
			addAllChilds(nodea, adescr);
		}

		BinaryNode nodeb = parent.getChildb();
		if (nodeb != null) {
			DefaultMutableTreeNode bdescr = new DefaultMutableTreeNode(
					"ChildB P:" + nodeb.getProbability() + " B:"
							+ nodeb.getBitvalue() + " L:" + nodeb.getLetter());
			descriptor.add(bdescr);
			addAllChilds(nodeb, bdescr);
		}
	}
Hoffe du kannst rekusion

Kommt dan sowas raus:
unbenanntcf.png
 
Zuletzt bearbeitet:
Danke Rekursion kann ich aber mit swing wollte ich das eigentlich nicht machen sondern nur mit Strings es soll dann aber so aussehen wie in "Dateisystem-Explorer-Ansicht" :
Edit: Mein Code sieht so aus :
Java:
public void printTree(int breite) {
 
        System.out.println("-" + getNumber());
 
        if (left != null) {
            System.out.print(" ");
            for (int i = 0; i < breite; i++) {
                System.out.print(" ");
            }
            // System.out.print("|");
            left.printTree(breite + 2 )      } else {
            System.out.print("|");
        }
 
        if (right != null) {
 
            System.out.print(" ");
            for (int i = 0; i < breite; i++) {
                System.out.print(" ");
            }
            // System.out.print("|");
            right.printTree(breite + 2)
        } else {
            System.out.print("|");
        }
 
    }
Mein Problem ist das ich noch Äste ausgeben will ich das aber nicht hinbekomme denn ohne Äste("|") sieht das ganze schon nach einen Baum in "Dateisystem-Explorer" Ansicht aus nur es sollen halt noch Äste zu sehen sein kann mir bitte jemand auf die Sprünge helfen wie ich die Äste ausgeben kann
 
Zuletzt bearbeitet:
Och naja, wenn's nicht "schön" sein soll, kann man sowas machen
Java:
class BinTree
{
    public static void main(String args[])
    {


        BinTree d = new BinTree("D");
        BinTree e = new BinTree("E");
        BinTree f = new BinTree("F");
        BinTree g = new BinTree("G");

        BinTree b = new BinTree("B", d, e);
        BinTree c = new BinTree("C", f, g);

        BinTree a = new BinTree("A", b, c);

        a.printTree();


        BinTree x = new BinTree("X");
        BinTree y = new BinTree("Y");
        BinTree z = new BinTree("Z");
        BinTree w = new BinTree("W");

        BinTree p = new BinTree("P", x, y);
        BinTree q = new BinTree("Q", z, w);

        BinTree r = new BinTree("R", p, q);

        BinTree t = new BinTree("T", a, r);

        t.printTree();


    }


    private BinTree left;
    private BinTree right;
    private String number;

    public BinTree(String number)
    {
        this.number = number;
    }

    public BinTree(String number, BinTree left, BinTree right)
    {
        this.number = number;
        this.left = left;
        this.right = right;
    }


    private String getNumber()
    {
        return number;
    }


    public void printTree()
    {
        printTree(0);
        System.out.println();
    }
    public void printTree(int level)
    {
        String s = "";
        for (int i=0; i<level; i++)
        {
            if (i==level-1)
            {
                s += "|--";
            }
            else
            {
                s += "|  ";
            }

        }

        System.out.println(s+getNumber());

        if (left != null)
        {
            left.printTree(level+1);
        }
        if (right != null)
        {
            right.printTree(level+1);
        }
    }
}
 
Als Antwort auf die PN (auch wenn mich das Gefühl beschleicht, gerade meine Mittagspause für deine Hausaufgaben geopfert zu haben...)
Java:
import java.util.*;

class BinTree
{
    public static void main(String args[])
    {


        BinTree d = new BinTree("D");
        BinTree e = new BinTree("E");
        BinTree f = new BinTree("F");
        BinTree g = new BinTree("G");

        BinTree b = new BinTree("B", d, e);
        BinTree c = new BinTree("C", f, g);

        BinTree a = new BinTree("A", b, c);

        a.printTree();

        BinTree x = new BinTree("X");
        BinTree y = new BinTree("Y");
        BinTree z = new BinTree("Z");
        BinTree w = new BinTree("W");

        BinTree p = new BinTree("P", x, y);
        BinTree q = new BinTree("Q", z, w);

        BinTree r = new BinTree("R", p, q);

        BinTree t = new BinTree("T", a, r);

        t.printTree();

    }


    private BinTree left;
    private BinTree right;
    private String number;

    public BinTree(String number)
    {
        this.number = number;
    }

    public BinTree(String number, BinTree left, BinTree right)
    {
        this.number = number;
        this.left = left;
        this.right = right;
    }


    private String getNumber()
    {
        return number;
    }


    public void printTree()
    {
        printTree(new ArrayList<String>(), this, false);
    }

    private static void printTree(List<String> prefixes, BinTree node, boolean last)
    {
        if (node == null)
        {
            System.out.println(stringFor(prefixes)+"-");
        }
        else
        {
            System.out.println(stringFor(prefixes)+"-"+node.getNumber());

            prefixes.add(" |");
            printTree(prefixes, node.left, false);
            prefixes.remove(prefixes.size()-1);
            prefixes.add("  ");
            printTree(prefixes, node.right, true);
            prefixes.remove(prefixes.size()-1);
        }
    }

    private static String stringFor(List<String> list)
    {
        String result = "";
        for (String s : list)
        {
            result += s;
        }
        return result;
    }
}
 
Besser ist natürlich
Java:
    public void printTree()
    {
        printTree("", this, false);
    }

    private static void printTree(String prefix, BinTree node, boolean last)
    {
        if (node == null)
        {
            System.out.println(prefix+"-");
        }
        else
        {
            System.out.println(prefix+"-"+node.getNumber());
            printTree(prefix+" |", node.left, false);
            printTree(prefix+"  ", node.right, true);
        }
    }

Was diese ArrayList da sollte, weiß ich jetzt nicht mehr.
 
Danke für eure hilfe aber ich habs jetzt so gemacht und es funtkioniert gut:
Java:
public void printTree(String prefix) {

		System.out.println(prefix + "-" + number);

		
		if (left != null) {

			left.printTree(prefix.concat(" |"));
		} else {
			System.out.println(prefix + "|-");
		}
		if (right != null) {

			right.printTree(prefix.concat(" "));
		} else {
			System.out.println(prefix + " -");
		}

	}
 

Zurück
Oben