[英]Find the kth smallest node in binary search tree
class Solution {
public int kthSmallest(TreeNode root, int k) {
int cnt = 0;
int val = -1000;
int res = inorderTraversal(root,k,cnt,val);
return res;
}
public int inorderTraversal(TreeNode root,int k,int cnt,int val){
if (root == null)
return val;
inorderTraversal(root.left,k,cnt,val);
cnt++;
//System.out.println(root.val);
if(cnt == k){
//System.out.println(root.val);
val = root.val;
return val;
}
inorderTraversal(root.right,k,cnt,val);
return val;
}
}
因此我了解到,我可以使用inorder traversal
来找到第k个最小节点。 我一经发现就无法理解如何将其发送回递归的最底层。 我在这里没有得到答案。
注意:这不是家庭作业或任何作业。 我对递归感到困惑,并试图理解这种方法
Questiun来自https://leetcode.com/problems/kth-smallest-element-in-a-bst/
实际上,您可以使用调试器在执行递归时可视化堆栈帧。
让我们在一个简单的BST上进行分析:
2
1 3
从root = 2开始(TopStackFrame:{root = 2,k = 3,cnt = 0,val = -1000})
|
根!=空
|
因此变为1(TopStackFrame:{root = 1,k = 3,cnt = 0,val = -1000})
|
现在转到1的左侧(TopStackFrame:{root = null,k = 3,cnt = 0,val = -1000})
|
root为null,它将返回val(已删除堆栈顶部)
|
现在回到1
|
cnt ++ cnt变为1(TopStackFrame:{root = 1,k = 3,cnt = 1,val = -1000})
|
cnt!= k移到1的右边(TopStackFrame:{root = null,k = 3 cnt = 1,val = -1000})
|
1的右边为null返回val(删除堆栈顶部)
|
然后再次返回val(TopStackFrame:{root = 1,k = 3,cnt = 1,val = -1000})
|
现在1完成。
|
现在您进入2(TopStackFrame:{root = 2,k = 3,cnt = 0,val = -1000})
现在您会看到cnt的值不是1而是0,因为每个stackframe都有自己的变量集。
变量val
发生类似的情况。
有几种解决方案:
a)您可以在类中将它们声明为成员变量并在递归中更新它们,因此您无需在递归中返回任何内容,只需声明一个不返回任何内容但更新这些成员变量的方法即可。
b)您可以使用int [] val,int [] cnt之类的数组,每个数组包含一个元素,并在每次递归调用中更新它们的元素。
c)您可以使用迭代有序遍历并在计数达到k时获取值。
我更喜欢'c'。 它更加干净,不必声明成员变量或数组。 它还可以防止高度不平衡的树中的stackoverflow异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.