[英]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.