我做了这个递归方法,计算二叉树中最长的路径。它的存储路径在一个集会上然后返回。但是,我不得不声明数组列表变量全局。是否可以制作此方法,但他的数组列表变量是本地的。
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;
}
我必须使它成为全局的原因是因为它是一个递归程序,每次它调用自身时,如果你知道我的意思,它将创建一个带有差异地址的新数组列表对象变量。
答案 0 :(得分:11)
在方法参数中传递arraylist:
public static <T> List<T> longestPath(BinaryNode<T> root, List<T> path){
然后当你进行递归调用时:
longestPath(root.right, path);
最初调用方法时只需传递new Arraylist()
答案 1 :(得分:5)
你应该做的是让你的主函数创建一个ArrayList
并将它传递给一个完成所有工作的辅助函数; e.g:
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
}
答案 2 :(得分:3)
如果您需要访问该变量并且无法使其成为全局变量,那么您的另一个选择是将其作为参数传递:
public static <T> ArrayList<T> longestPath(BinaryNode<T> root, ArrayList path) {
//...
答案 3 :(得分:3)
如果将ArrayList传递给递归函数yes:
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;
}