package jcf_map.exercise;

import java.util.Map;
import java.util.TreeMap;

import binary_tree.BinaryNode;

public class BinaryTreeMap {
	/*
	 * Esercizio 1 - Esame del secondo parziale 8/1/2019
	 * Scrivere un metodo generico statico ContaDuplicati che conta il numero 
	 * di oggetti duplicati (non univoci) contenuti in un albero binario.
	 * Il risultato è il conteggio totale degli elementi che risultano duplicati 
	 * (non il numero totale di occorrenze, ma il numero di oggetti distinti che 
	 * hanno almeno un duplicato)
	 */
	public static <T extends Comparable<? super T>> int ContaDuplicati(BinaryNode<T> node) {
		int dup = 0;
		TreeMap<T, Integer> mappa = new TreeMap<T, Integer>();
		ContaDuplicati(node, mappa);
		
		for (T element : mappa.keySet()) {
			int occurrency = mappa.get(element);
			if (occurrency > 1) dup++;
		}
		
		return dup;
	}
	
	protected static <T> void ContaDuplicati(BinaryNode<T> node, TreeMap<T, Integer> mappa) {
		if (node == null) return;
		
		if (node.getLeft() != null) ContaDuplicati(node.getLeft(), mappa);
		if (node.getRight() != null) ContaDuplicati(node.getRight(), mappa);
		
		if (node.getData() == null) return;
		
		T data = node.getData();
		if (mappa.get(data) == null) mappa.put(data, 1);
		else mappa.put(data, mappa.get(data) + 1);
	}
	
}
