У меня есть вопрос о том, как лучше всего передать объект, который может содержать null, другим методам. Другой метод создаст новый экземпляр, если объект, если переданный объект имеет значение null. Мой вопрос заключается в том, как разрешить второму методу изменять исходный начальный переданный нулевой указатель объекта. По сути, я столкнулся с этой проблемой при чтении BST из файла и создании дерева. Я думаю, что объяснение проблемы на том же примере имеет больше смысла:
В приведенном ниже коде я читаю и создаю BST из всех значений, хранящихся в очереди. Значения Queue — это обход дерева по порядку, который я прочитал из другого метода.
TreeNode root2;
public void readBST(Queue<Integer> input){
if (input==null || input.isEmpty()) return;
int i=input.poll();
root2 = new TreeNode(i);
readBSTHelper(root2.leftChild , input, Integer.MIN_VALUE , i-1);
readBSTHelper(root2.rightChild, input, i+1, Integer.MAX_VALUE);
}
private void readBSTHelper(TreeNode curr, Queue<Integer> input, int min, int max){
if (input==null && input.isEmpty()) return;
int i = input.peek();
if (i>=min && i<=max){
input.poll();
curr = new TreeNode(i);
readBSTHelper(curr.leftChild, input, min, i-1);
readBSTHelper(curr.rightChild,input, i+1, max);
}
}
Однако проблема, с которой я сталкиваюсь, заключается в том, что когда создается root2
, leftChild
и rightChild
становятся null
. на самом деле TreeNode(i)
составляет TreeNode
с data=i
и leftChild
и rightChild
равными null
. Когда я вызываю readBSTHelper
, передавая root2.leftChild
, он передает указатель null
. Поскольку это указатель null
, копия указателя null
передается в readBSTHelper
. Таким образом, результат из readBSTHelper
теряется и никогда не возвращается/присваивается реальному root2.leftChild
. Мы можем предотвратить такую проблему в C++, передав ссылку исходного указателя. Мне удалось временно решить проблему, изменив код, как показано ниже:
TreeNode root2;
public void readBST(Queue<Integer> input){
if (input==null || input.isEmpty()) return;
int i=input.poll();
root2 = new TreeNode(i);
readBSTHelper(root2, "left", input, Integer.MIN_VALUE , i-1);
readBSTHelper(root2, "right", input, i+1, Integer.MAX_VALUE);
}
private void readBSTHelper(TreeNode curr, String side, Queue<Integer> input, int min, int max){
if (input.isEmpty()) return;
int i = input.peek();
if (i>=min && i<=max){
input.poll();
if (side.equals("left")) {
curr.leftChild = new TreeNode(i);
readBSTHelper(curr.leftChild,"left", input, min, i-1);
readBSTHelper(curr.leftChild, "right", input, i+1, max);
} else {
curr.rightChild = new TreeNode(i);
readBSTHelper(curr.rightChild,"left", input, min, i-1);
readBSTHelper(curr.rightChild, "right", input, i+1, max);
}
}
}
Но этот код выглядит уродливым для меня. Любые советы о том, как заставить работать первый код?