簡體   English   中英

在二分搜索樹中找到第k個最小的節點

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM