【发布时间】:2014-01-21 02:28:04
【问题描述】:
我有两种解决方案来打印二叉树中从根到所有叶子的所有路径,如下所示。
在 Sol 1 中,在递归中使用 List 作为参数来添加从根到每个叶节点的路径,然后在从递归返回后,我必须删除一个正在返回的节点。 据我所知,这是因为 List 是一个存储在堆中并被所有人共享的对象。 所以每次递归调用都使用同一个List对象列表,因此需要移除。
但是,在 Sol 2 中,我使用数组作为参数,并且不需要像 List 那样删除返回的节点。我不明白为什么?
根据我的理解,由于数组也是一个对象,存储在堆中并由每个递归调用共享。因此它应该与 List 情况相同,我认为我需要从递归调用中删除返回的节点。但事实并非如此。
你能解释一下为什么递归调用返回的节点不必像 List 那样被删除吗?我对 List case 的理解是否正确?请让我知道这让我很困惑。
解决方案 1:递归 1 - 使用列表
void printPathsFromRootToLeavesRec1(BTNode node, List<BTNode> list) {
if(node == null) return;
list.add(node);
// viristed and added node from root --> left subtree --> right subtree
if(node.left == null && node.right == null)
printNodeList(list);
printPathsFromRootToLeavesRec1(node.left, list);
printPathsFromRootToLeavesRec1(node.right, list);
**// Note 1: KEY POINT = Remove after print !!!
list.remove(node);**
}
解决方案 2:递归 2 - 使用数组
void printPathFromRootToLeavsRec2(BTNode node, BTNode[] array, int index) {
if(node == null) return;
array[index] = node;
index++;
if(node.left == null && node.right == null) printPathArray(array, index);
printPathFromRootToLeavsRec2(node.left, array, index);
printPathFromRootToLeavsRec2(node.right, array, index);
**// We don't need to remove the returned node in the array case unlike List**
}
【问题讨论】:
标签: java arrays list recursion