5

我做了这个递归方法来计算二叉树中的最长路径。将其存储在 arralist 中的路径,然后返回。但是,我必须将数组列表变量声明为全局的。是否可以使用这种方法,但他的数组列表变量是本地的。

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;

}

我必须使它成为全局的原因是因为它是一个递归程序,每次它调用自己时,如果你知道我的意思,它会创建一个具有不同地址的新数组列表对象变量。

4

4 回答 4

11

在方法参数中传递arraylist:

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

然后当你进行递归调用时:

longestPath(root.right, path);

new Arraylist()最初调用该方法时只需传递 a

于 2013-03-21T16:20:36.500 回答
5

你应该做的是让你的 main 函数创建一个ArrayList并将其传递给一个辅助函数来完成所有工作;例如:

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
}
于 2013-03-21T16:24:50.037 回答
3

如果您需要访问该变量并且不能使其成为全局变量,您的另一个选择是将其作为参数传递:

    public static <T> ArrayList<T> longestPath(BinaryNode<T> root, ArrayList path) {
    //...
于 2013-03-21T16:21:02.307 回答
3

如果你将 ArrayList 传递给你的递归函数,是的:

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;

 } 
于 2013-03-21T16:21:30.527 回答