2013-03-21 28 views
5

Ho fatto questo metodo ricorsivo che calcola il percorso più lungo in un albero binario. il percorso è stato archiviato in un arralist e poi restituito. tuttavia, ho dovuto dichiarare la variabile della lista della matrice globale. è possibile fare questo metodo ma la sua variabile di lista di matrice è locale.come rendere locale una variabile

public static <T> ArrayList<T> longestPath(BinaryNode<T> root){ 
    //ArrayList path = new ArrayList(); 

    if(root == null) return null; 

    if(height(root.left) > height(root.right)){ 
     path.add(root.element); 

     longestPath(root.left); 


    }else{ 
     path.add(root.element); 

     longestPath(root.right); 

    } 

    return path; 

} 

La ragione per cui ho dovuto fare è globale è perché il suo un programma ricorsivo e ogni volta che si chiamano creerà una nuova variabile oggetto lista di array con l'indirizzo differenza se sai cosa voglio dire.

+2

Non ci sono variabili globali in Java ...? –

+1

@RichardJPLeGuen: quasi certamente intendeva un campo 'statico'. –

risposta

5

Che cosa si dovrebbe fare è avere la tua funzione principale creare un ArrayList e passare in una funzione di supporto che fa tutto il lavoro; ad esempio:

public static ArrayList longestPath(BinaryNode root) 
{ 
    ArrayList path = new ArrayList(); 
    return longestPathHelper(root, path); 
} 

private static ArrayList longestPathHelper(BinaryNode root, ArrayList path) 
{ 
    // Existing code, except recursive calls pass path as well 
} 
11

Passare l'arraylist nei parametri di metodo:

public static <T> List<T> longestPath(BinaryNode<T> root, List<T> path){ 

Poi, quando si fa la chiamata ricorsiva:

longestPath(root.right, path); 

semplicemente passare un new Arraylist() quando si chiama il metodo inizialmente

3

Se bisogno di accedere alla variabile e non può renderlo globale, l'altra opzione è quella di passarlo come parametro:

public static <T> ArrayList<T> longestPath(BinaryNode<T> root, ArrayList path) { 
    //... 
3

se si passa l'ArrayList alla funzione ricorsiva sì:

public static <T> ArrayList<T> longestPath(BinaryNode<T> root, ArrayList path){ 
ArrayList lPath = path; 

if(root == null) return null; 

if(height(root.left) > height(root.right)){ 
    lPath.add(root.element); 

    longestPath(root.left, lPath); 


}else{ 
    lPath.add(root.element); 

    longestPath(root.right, lPath); 

} 

return lPath; 

} 
Problemi correlati