2013-03-21 13 views
5

Ich habe diese rekursive Methode, die den längsten Pfad in einem binären Baum berechnet. der Pfad wird in einem Arralist gespeichert und dann zurückgegeben. Allerdings musste ich die Array-Listenvariable global deklarieren. ist es möglich, diese Methode zu erstellen, aber seine Array-Listenvariable ist lokal.Wie mache ich eine Variable local

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; 

} 

Der Grund, warum ich es global machen musste, weil sein ein rekursive Programm und jedes Mal, es selbst nennt es wird eine neue Array-Liste Objektvariable mit Differenz-Adresse erstellen, wenn Sie wissen, was ich meine.

+2

Es gibt keine globalen Variablen in Java ...? –

+1

@RichardJPLeGuen: Er meinte fast sicher ein 'statisches' Feld. –

Antwort

5

Was sollten Sie tun müssen, ist Ihre Hauptfunktion eine ArrayList erstellen und sie in eine Hilfsfunktion übergeben, die die ganze Arbeit tut; Beispiel:

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

Geben Sie die Arraylist in die Methodenparameter:

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

Dann, wenn Sie den rekursiven Aufruf zu tun:

longestPath(root.right, path); 

Nur eine new Arraylist() geben, wenn Sie die Methode

3

zunächst rufen Sie benötigen Zugriff auf die Variable und können es nicht global machen, Ihre andere Option besteht darin, sie als Parameter zu übergeben:

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

, wenn Sie die Arraylist auf Ihre rekursive Funktion übergeben ja:

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; 

} 
Verwandte Themen