Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    BinaryTree: rimuovere sottoalbero ed albero completo

    Ciao a tutti, sto svolgendo deli esercizi sugli alberi binari ma alcuni di questi non mi funzionano. Posto il codice:

    codice:
     
    public class BinaryTree 
    {
    	protected class Node 
    	{
    	
    		Integer element;
    		Node left;
    		Node right;
    		
    		Node(int element) 
    		{
    			this.element = element;
    			left = right = null;
    		}
    
    		Node(int element, Node left, Node right) 
    		{
    			this.element = element;
    			this.left = left;
    			this.right = right;
    		}
    
    		boolean isLeaf() 
    		{
    			return left == null && right == null;
    		}
    	}
    
    	protected Node root;
    
    	public BinaryTree() 
    	{
    		root = null;
    	}
    
    	public boolean isComplete() 
    	{
    		return isComplete(root) > -2;			
    	}
    		
    	private int isComplete(Node node)
    	{
    		int hl;
    		int hr;
    		if(node == null) 
    			return -1; 
    		hl = isComplete(node.left);
    		hr = isComplete(node.right);
    		if(hl != hr) 
    			return -2;
    		else 
    			return 1 + Math.max(hl, hr);
    	}
    
    	private class BoolNode 
    	{
    	
    		boolean fatto;
    		Node nodo;
    
    		BoolNode(boolean fatto, Node nodo) 
    		{
    			this.fatto = fatto;
    			this.nodo = nodo;
    		}
    	}
    	
    	public boolean removeSubtree(int x) 
    	{
    		BoolNode ris = removeSubtree(root, x);
    		root = ris.nodo;
    		return ris.fatto;
    	}
    		
    	private BoolNode removeSubtree(Node node, int x) 
    	{
    		if(node == null) 
    			return new BoolNode(false, null);
    		if(node.element == x) 
    			return new BoolNode(true, null);
    		BoolNode result = removeSubtree(node.left, x);
    		if(result.fatto) 
    			node.left = null; 
    		else {
    			result = removeSubtree(node.right, x);
    			node.right = null; 
    		}
    		return new BoolNode(result.fatto, node);	
    	}
    }
    
    Il metodo isComplete deve restituire true se l'albero e' completo, false altrimenti. Un albero e' completo se:
    - tutti i livelli sono saturi tranne eventualmente l'ultimo
    - l'ultimo livello e' riempito da sinistra verso destra.

    Questo metodo funziona ma penso mi manchi un caso da considerare, cioè quando i due sottoalberi sono entrambi non compelti. Come devo modificare il codice in quel caso?

    Il metodo removeSubtree invece elimina il sottoalbero di radice x. Se x è presente più volte, elimina uno solo dei sottoalberi. Se l'eliminazione è andata a buon fine restituisce true, se invece l'elemento non è presente restituisce false.
    Questo metodo non funziona perchè se gli inserisco un albero del tipo

    e gli metto x = 8, mi restituisce
    L'errore è nelle due istruzioni sottolineate.. ma non so come modificarle..
    Qualche aiuto?

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2011
    Messaggi
    143
    Nessuno?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.