我在Java中查看此代码,将已排序的链接列表转换为平衡的BST,我想知道为什么实现#1不起作用。什么是Java的原因,当我创建一个包装器对象并传递它然后它完美的工作,但当我使用本地引用它不?仍然在堆右侧创建对象。
实施#1
BinaryTree.Node sortedListToBST(MyList.Node w, int start, int end)
{
if (start > end) return null;
int mid = start + (end - start) / 2;
BinaryTree.Node left = sortedListToBST(w, start, mid-1);
BinaryTree.Node parent = new BinaryTree.Node(w.getVal());
w = w.getNext();
BinaryTree.Node right = sortedListToBST(w, mid+1, end);
parent.left = left;
parent.right =right;
return parent;
}
BinaryTree.Node sortedListToBST(MyList.Node head, int n) {
return sortedListToBST(head, 0, n-1);
}
实施#2
BinaryTree.Node sortedListToBSTWrapper(Wrapper w, int start, int end)
{
if (start > end) return null;
int mid = start + (end - start) / 2;
BinaryTree.Node left = sortedListToBSTWrapper(w, start, mid-1);
BinaryTree.Node parent = new BinaryTree.Node(w.node.getVal());
w.node = w.node.getNext();
BinaryTree.Node right = sortedListToBSTWrapper(w, mid+1, end);
parent.left = left;
parent.right =right;
return parent;
}
BinaryTree.Node sortedListToBSTWrapper(MyList.Node head, int n) {
Wrapper w = new Wrapper();
w.node = head;
return sortedListToBSTWrapper(w, 0, n-1);
}
答案 0 :(得分:4)
关键是:
w.node = w.node.getNext();
在第一个实现中,忘记了递归级别中的“前进指针”;父母来电者看不到先进的位置。
如果你想让第一个方法工作,你需要随身携带Iterator /或让包含类包含某种类型的迭代器,以便在构建LHS时通过源列表前进给父母和用于建立RHS ..然后返回祖父母等等。
如果语言具有多值返回,则可以返回(BinaryTree.Node,MyList.Node)并使用该元组中的第二个字段来跟踪您的工作进度。
基本上,你已经破解了一个解决方案 - 它将是干净的&如果你使W成为迭代器,那么就更正确了,而不是你想要的非结构化的东西。