【发布时间】:2017-08-02 03:36:28
【问题描述】:
我试图解决一个问题:
打印二叉树的所有路径,从根到叶。
我写了如下代码,结果是正确的:
public void printPath(TreeNode root) {
printDFS(root, new int[1000], 0);
}
private void printDFS(TreeNode r, int[] path, int idx){
if (r == null) return;
path[idx] = r.val;
idx++;
/* if it's leaf, print path: from root to leaf */
if (r.left == null && r.right == null)
printOnePath(path, idx);
else {
/* go left, go right */
printDFS(r.left, path, idx);
printDFS(r.right, path, idx);
}
}
private void printOnePath(int[] path, int idx) {
for (int i = 0; i < idx; i++) {
System.out.print(path[i] + " ");
}
System.out.println();
}
然而,
当我尝试使用 ArrayList 来存储路径数据时,而不是 int[]。
这种方法变得错误。
而且输出结果真的让我迷失了。
public void printPath(TreeNode root) {
printDFS(root, new ArrayList<Integer>(), 0);
}
private void printDFS(TreeNode r, List<Integer> path, int idx){
if (r == null) return;
path.add( r.val );
idx++;
/* if it's leaf, print path: from root to leaf */
if (r.left == null && r.right == null)
printOnePath(path, idx);
else {
/* otherwise: go left, go right */
printDFS(r.left, path, idx);
printDFS(r.right, path, idx);
}
}
private void printOnePath(List<Integer> path, int idx) {
for (int i = 0; i < idx; i++) {
System.out.print(path.get(i) + " ");
}
System.out.println();
}
例如:
第一个 STDOUT 是:(正确)
10 5 3 3
10 5 3 -2
10 5 2 1
10 -3 11
第二个 STDOUT 是:(错误)
10 5 3 3
10 5 3 3
10 5 3 3
10 5 3
我相信初始的 ArrayList 在每个 DFS 的一开始就已经设置为空。 为什么结果与 int 数组完全不同,即使使用相同的方法?
有人知道为什么吗?非常感谢!
【问题讨论】:
-
path[idx] = r.val;和path.add( r.val );的含义截然不同。 -
ArrayList类包含所有元素,包括null,并且列表不能存储double等原始值。
-
@Tehmina 那么你的意思是什么?该代码已经使用了
ArrayList<Integer>,它可以工作。
标签: java arraylist tree traversal microsoft-distributed-file-system