繁体   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