algorytm.org

Implementacja w Java



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Drzewo - Implementacja w Java
Ocena użytkownikóww: *****  / 5
SłabyŚwietny
Nadesłany przez Dominik Goździuk, 02 listopada 2011 21:38
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

Drzewo.java:
//Implementacja Drzewa
//(c) Dominik Goździuk
//www.algorytm.org

import java.util.LinkedList;

interface INode<T> {
	public Node<T> getParent(); // zwraca referencje rodzica
	public void setParent(Node<T> parent); // ustawia rodzica dla węzła
	public T getData(); // zwraca przechowywane dane
	public void setData(T data); // ustawia dane w węźle
	public int getDegree(); // zwraca stopień węzła
	public Node<T> getChild(int i); // zwraca referencje do i-tego dziecka
	public boolean isLeaf(); // sprawdza czy węzeł jest liściem
	public Node<T> addChild(Node<T> child); // dodaje do węzła dziecko (inny węzeł)
	public Node<T> addChild(T data); // tworzy i dodaje do węzła dziecko z danymi
	public Node<T> removeChild(int i); // usuwa i-te dziecko węzła
	public void removeChildren(); // usuwa wszystkie dzieci węzła
	public Node<T> getLeftMostChild(); // zwraca pierwsze dziecko węzła (z lewej)
	public LinkedList<Node<T>> getChildren(); // zwraca listę dzieci
	public Node<T> getRightSibling(); // zwraca kolejny element siostrzany węzła
	public String toString(); // wyświetla węzeł (najczęściej dane)
}

class Node<T> implements INode<T> {
	private T data; // dane
	private Node<T> parent; // referencja do rodzica
	private LinkedList<Node<T>> children; // lista dzieci

	public Node() { // konstruktor domyślny
		parent = null;
		children = new LinkedList<Node<T>>();
	}
	
	public Node(Node<T> parent) { // konstruktor jednoparametrowy
		this();
		this.parent = parent;
	}

	public Node(Node<T> parent, T data) { // konstruktor dwuparametrowy
		this(parent);
		this.data = data;
	}
	
	
	public Node<T> getParent() {
		return parent;
	}
	
	public void setParent(Node<T> parent) {
		this.parent = parent;
	}
	
	public T getData() {
		return data;
	}
	
	public void setData(T data) {
		this.data = data;
	}
	
	public int getDegree() {
		return children.size();
	}
	
	public Node<T> getChild(int i) {
		return children.get(i);
	}
	
	public boolean isLeaf() {
		return children.isEmpty();
	}
	
	public Node<T> addChild(Node<T> child) {
		child.setParent(this);
		children.add(child);
		return child;
	}
	
	public Node<T> addChild(T data) {
		Node<T> child = new Node<T>(this, data);
		children.add(child);
		return child;
	}
	
	public Node<T> removeChild(int i) {
		return children.remove(i);
	}
	
	public void removeChildren() {
		children.clear();
	}
	
	public Node<T> getLeftMostChild() {
		if (children.isEmpty()) return null;
		return children.get(0);
	}
	
	public LinkedList<Node<T>> getChildren() {
		if (children.isEmpty()) return null;
		return children;
	}
	
	public Node<T> getRightSibling() {
		if (parent != null) {
			LinkedList<Node<T>> childrenParent = parent.getChildren();
			int pozycja = childrenParent.indexOf(this);
			if (childrenParent.size() > pozycja+1)
			return childrenParent.get(pozycja+1);
		}
		return null;
	}
	
	public String toString() {
		return data.toString();
	}
}

class Tree<T> {
	private Node<T> root; // referencja do korzenia

	public Tree() { // konstruktor domyślny
		root = null;
	}

	public Tree(Node<T> root) { // konstruktor jednoparametrowy
		this.root = root;
	}
	
	public Node<T> getRoot() {
		return root;
	}
	
	public void preOrder(Node<T> n) {
		System.out.print(n + " ");
		Node<T> temp = n.getLeftMostChild();
		while (temp != null) {
			preOrder(temp);
			temp = temp.getRightSibling();
		}
	}
	
	public void inOrder(Node<T> n) {
		if (n.isLeaf())
			System.out.print(n + " ");
		else {
			Node<T> temp = n.getLeftMostChild();
			inOrder(temp);
			System.out.print(n + " ");
			temp = temp.getRightSibling();
			while (temp != null) {
				inOrder(temp);
				temp = temp.getRightSibling();
			}
		}
	}
	
	public void postOrder(Node<T> n) {
		Node<T> temp = n.getLeftMostChild();
		while (temp != null) {
			postOrder(temp);
			temp = temp.getRightSibling();
		}
		System.out.print(n + " ");
	}
	
	
}

public class Drzewo {
	public static void main(String[] args) {
		Node<String> korzen = new Node<String>(null, "G");
		
		Node<String> n1 = korzen.addChild("E");
		Node<String> n2 = korzen.addChild("C");
		Node<String> n3 = korzen.addChild("V");
		n1.addChild("Z");
		Node<String> n4 = n1.addChild("M");
		n1.addChild("P");
		n4.addChild("J");
		Node<String> n5 = n2.addChild("X");
		n5.addChild("H");
		n5.addChild("O");
		n3.addChild("B");
		Node<String> n6 = n3.addChild("S");
		n6.addChild("F");
		
		Tree<String> drzewo = new Tree<String>(korzen);
		
		System.out.print("Pre Order: ");
		drzewo.preOrder(korzen);
		System.out.print("\nPost Order: ");
		drzewo.postOrder(korzen);
		System.out.print("\nIn Order: ");
		drzewo.inOrder(korzen);
		System.out.println ();
		
	}
}
Dodaj komentarz