package fr.ups.bioinfo.tp4;

public class Noeud<T extends Comparable<T>>
{
	T valeur;
	Noeud<T> filsGauche, filsDroit;
	
	public Noeud()
	{
		valeur = null;
		filsGauche = null;
		filsDroit = null;
	}
	
	public Noeud(T val)
	{
		valeur = val;
		filsGauche = null;
		filsDroit = null;
	}
	
	public void ajouterValeur(T val)
	{
		if(valeur == null)
			valeur = val;
		else
		{
			if(valeur.compareTo(val)>0)
			{
				if(filsGauche != null)
					filsGauche.ajouterValeur(val);
				else
					filsGauche = new Noeud<T>(val);
			}
			else
			{
				if(filsDroit != null)
					filsDroit.ajouterValeur(val);
				else
					filsDroit = new Noeud<T>(val);
			}
		}
	}
	
	public String toString()
	{
		StringBuffer buf = new StringBuffer();
		if(filsGauche!=null)
			buf.append(filsGauche.toString());
		System.out.print(valeur+" | ");
		if(filsDroit!=null)
			buf.append(filsDroit.toString());
		return buf.toString();
	}
	
	public boolean rechercher(T val)
	{
		if(valeur.compareTo(val)==0)
			return true;
		if(valeur.compareTo(val)>0)
		{
			if(filsGauche!=null)
				return filsGauche.rechercher(val);
			return false;
		}
		if(filsDroit!=null)
			return filsDroit.rechercher(val);
		return false;
	}
	
	public static void main(String[] args) 
	{
		System.out.println("*** Arbre d'entiers ***");
		Noeud<Integer> racine = new Noeud<Integer>(5);
		racine.ajouterValeur(10);
		racine.ajouterValeur(3);
		racine.ajouterValeur(30);
		racine.ajouterValeur(1);
		racine.ajouterValeur(4);
		racine.ajouterValeur(2);
		System.out.println(racine);
		System.out.println(racine.rechercher(4));
		System.out.println(racine.rechercher(0));
		System.out.println("*** Arbre de chaines de caractères ***");
		Noeud<String> racine2 = new Noeud<String>("bonjour");
		racine2.ajouterValeur("allo");
		racine2.ajouterValeur("tout");
		racine2.ajouterValeur("le");
		racine2.ajouterValeur("monde");
		System.out.println(racine2);
		System.out.println(racine2.rechercher("le"));
		System.out.println("*** Arbre de personnes ***");
		Noeud<Personne> racine3 = new Noeud<Personne>();
		racine3.ajouterValeur(new Personne("Durant","Paul"));
		racine3.ajouterValeur(new Personne("Durant","Edmond"));
		racine3.ajouterValeur(new Personne("Dupont","Jean"));
		racine3.ajouterValeur(new Personne("Martin","Caroline"));
		System.out.println(racine3);
		System.out.println(racine3.rechercher(new Personne("a","a")));
	}
}
