Java 使用全局变量与编写递归算法时传递变量
我有一种方法可以展平二叉搜索树。我有两种方法: •使用变量并传递Java 使用全局变量与编写递归算法时传递变量,java,recursion,Java,Recursion,我有一种方法可以展平二叉搜索树。我有两种方法: •使用变量并传递 import java.util.*; public class BST { private Node root; private class Node { private int val; // associated data private Node left, right; // left and right subtree public Node(int val)
import java.util.*;
public class BST {
private Node root;
private class Node {
private int val; // associated data
private Node left, right; // left and right subtree
public Node(int val) {
this.val = val;
}
}
public ArrayList<Integer> flattenTree(){
ArrayList<Integer> list = new ArrayList<>();
flattenTree(root, list);
return list;
}
public void flattenTree(Node node, ArrayList<Integer> list)
{
if (node == null)
return;
flattenTree(node.left, list);
list.add(node.val);
flattenTree(node.right, list);
}
public static void main(String[] args) {
BST bst = new BST();
bst.add(5);
bst.add(1);
bst.add(0);
bst.add(3);
System.out.println(bst.flattenTree());
}
}
我是java(高中)的初学者,不知道每种方法的优缺点是什么
我能想到的唯一一种方法是#2不必传递列表,因此代码不那么凌乱。总体而言,全局变量的缺点是双重的 1) 您只有一个全局变量,因此不能同时运行代码的两个副本(即多个线程) 2) 全局变量可以在代码可能不期望的其他地方修改
您的第一个答案是更好的工程解决方案。为了补充@caskey的观点,我想指出第一版代码的另外两个主要优点 首先,接受显式列表的代码更难被错误使用。如果调用代码的第二个版本,则需要
- 确保没有其他人在并行线程中调用该方法
- 确保列表变量已初始化
- 确保列表中没有其他内容,并且
- 记住,当你看完这张单子时,要把它读完
- 该类是否有需要保留的状态
- 如果是,状态是什么(即字段)
- 您可以通过在方法调用中传递参数来避免状态,这样可以更容易地测试代码
import java.util.*;
public class BST {
private Node root;
ArrayList<Integer> list = new ArrayList<>();
private class Node {
private int val; // associated data
private Node left, right; // left and right subtree
public Node(int val) {
this.val = val;
}
}
public ArrayList<Integer> flattenTree(){
flattenTree(root);
return list;
}
public void flattenTree(Node node)
{
if (node == null)
return;
flattenTree(node.left);
list.add(node.val);
flattenTree(node.right);
}
public static void main(String[] args) {
BST bst = new BST();
bst.add(5);
bst.add(3);
bst.add(1);
bst.add(0);
bst.add(3);
bst.add(3);
bst.printInorder();
System.out.println(bst.flattenTree());
}
sgupta$ java BST
[0, 1, 3, 5]