【发布时间】:2021-01-06 13:21:55
【问题描述】:
我已经考虑了这么久,它正在煎熬我的大脑。可能我还没有完全理解递归。
我不明白为什么 k 的值在等于 0 后不进入负数。相反,它保持为 0,直到辅助函数存在。我尝试传入一个初始值为 0 的整数并相加直到其值等于 k。然而,这导致了同样的问题,一旦它等于 k,它就会保持这种状态。
有人可以解释为什么值保持不变吗?
class Solution {
public int kthSmallest(TreeNode t, int k) {
TreeNode tempNode = new TreeNode();
int iter = 0;
getKValue(t, k, tempNode);
return tempNode.val;
}
private static void getKValue(TreeNode t, int k, TreeNode temp) {
if(t == null) {
return;
}
getKValue(t.left, k, temp);
k = k - 1;
System.out.println(k);
if(k == 0) {
temp.val = t.val;
return;
}
getKValue(t.right, k, temp);
}
}
例如,对于下面的树,预期的输出是 1。但我得到 3,控制台打印了两次 0。
Input: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
Output: 1
【问题讨论】:
-
尝试在一张纸上调试并跟踪执行,您就会知道为什么会得到 3 和 0 被打印两次。您正在递归调用辅助函数,然后执行 k = k - 1 这就是为什么您看到 0 打印了两次。最后一次返回将在节点 3,这就是返回 3 的原因
-
@SherifelKhatib -- 实际上并非如此。他被打印了两次,因为每次他调用递归方法时,都会从树的左侧和右侧生成 K 的新副本。他需要发送一个 K,这对于 LHS 和 RHS 都是通用的(就是引用调用的情况,但不幸的是 java 不支持引用调用)
-
@PapaifromBEKOAIL 我的理由是从执行的角度来看,而你的理由是从算法的角度来看......同样的
标签: java algorithm recursion binary-tree depth-first-search