gpt4 book ai didi

java - 相当于 Java 中传递空指针的引用传递

转载 作者:行者123 更新时间:2023-12-02 07:12:55 26 4
gpt4 key购买 nike

我有一个关于将可能包含 null 的对象传递给其他方法的最佳方法的问题。如果传递的对象为 null,则另一个方法将创建一个新实例。我的问题是如何允许第二种方法修改原始初始传递的空对象指针。基本上,我在从文件读取 BST 并制作树时遇到了这个问题。我认为使用相同的例子来解释问题更有意义:

在下面的代码中,我从队列中存储的所有值读取并构建 BST。队列值是我从另一个方法读取的树的按序遍历。

    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已创建,它是 leftChildrightChildnull 。事实上TreeNode(i)制作 TreeNodedata=ileftChildrightChild等于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);
}

}
}

但是这段代码对我来说看起来很难看。关于如何使第一个代码工作有什么建议吗?

最佳答案

选项 1:包装

class NodeWrapper
{
TreeNode node;
}

class TreeNode
{
...
TreeNode(int num)
{
leftChild = new NodeWrapper();
rightChild = new NodeWrapper();
...
}
NodeWrapper leftChild, rightChild;
}

void readBSTHelper(NodeWrapper curr, Queue<Integer> input, int min, int max)
{
...
}

选项 2:在构造函数中初始化子级

我建议有一个专门用于此目的的单独的构造函数(如下所示),否则您的插入函数将错误地创建子级。

class TreeNode
{
...
TreeNode()
{
val = null;
}
TreeNode(int num)
{
init(num);
}
init(int num)
{
leftChild = new TreeNode();
rightChild = new TreeNode();
val == num;
}
Integer val;
}

public void readBST(Queue<Integer> input){
if (input==null || input.isEmpty()) return;
int i=input.poll();
root2 = new TreeNode(i);
if (!readBSTHelper(root2.leftChild , input, Integer.MIN_VALUE , i-1))
root2.leftChild = null; // delete child if not populated
if (!readBSTHelper(root2.rightChild, input, i+1, Integer.MAX_VALUE))
root2.rightChild = null; // delete child if not populated
}

boolean readBSTHelper(TreeNode curr, Queue<Integer> input, int min, int max){
if (input==null && input.isEmpty()) return false;
int i = input.peek();
if (i>=min && i<=max){
input.poll();
curr.init(i);
if (!readBSTHelper(curr.leftChild, input, min, i-1))
curr.leftChild = null;
if (!readBSTHelper(curr.rightChild, input, i+1, max))
curr.rightChild = null;
return true;
}
return false;
}

关于java - 相当于 Java 中传递空指针的引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15288579/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com